Компилиране на nginx с последният SSL за ALPN, HTTP 2.0 и TCP Fast Open

Nginx е един от най-широко използваните уеб сървъри в световен мащаб. Много хора го предпочитат пред доказания конкурент apache, и със сигурност има защо. Докато всеки има своите предимства и недостатъци, nginx предлага гъвкавост и бързина, което го прави фаворит сред избора на web server software в днешни дни.
Ако се чудите дали си заслужава да опитате nginx – отговорът ни е да. Технологиите се развиват и навлизат във всеки един момент. ALPN и HTTP 2.0 не са изключение, дори напротив – времето да ги използвате е точно сега. В тази статия, ще ви покажем не само как да компилирате nginx, но и как да го настроите с последните stable OpenSSL, ALPN и HTTP 2.0 поддръжки, като ще обясним какво представлява всяко едно от тях.

Какво е HTTP2.0?

HTTP 2.0 е новата версия на основния протокол за пренос на данни. До момента масово се използваше HTTP1.1, но от извество време насам навлиза и HTTP2.0. Подобренията включват това, че този протокол е бинарен, не текстов. Също така е напълно мултиплексиран и може да сервира няколко елемента (css,js,jpeg,png и др.) с една TCP връзка и множество потоци, вместо с няколко потоци и няколко връзки.

Какво е ALPN?

ALPN (Application-Layer Protocol Negotiation) е TLS разширение, приложимо в Application слоя на OSI модела. То позволява на слоя да избере кой протокол да се използва при криптирана връзка, за да се избегнат допълнителни проверки и удостоверения. Той работи заедно с HTTP2.0 стандарта.

Какво е Tcp Fast Open (TFO)?

Tcp Fast Open е технология, при която се редуцира мрежовата латенция при комуникация през TCP, като се изпращат данни още при първоначалният SYN пакет. По този начин се избягва постоянното използване на three way handshake модела при TCP.

open-ssl

В тази статия ще ви покажем как да компилирате няколко неща. Първото от тях е OpenSSL. Повечето дистрибуции не идват с последната OpenSSL версия, за това е нужно вие да добавите по-нова. Това е важна част от инсталацията, защото без нея няма да имате ALPN поддръжка.

В текущия пример сме използвали дистрибуцията CentOS 7. Инсталацията е еднаква за всички модерни дистрибуции, с изключението на инсталацията на development пакетите.

Влезте в сървъра през SSH

 ssh root@yourserver

Нужно е да инсталирате набор от devel пакети, за да могат компилациите ви да завършат успешно.

 yum groupinstall 'Development Tools' 

В Debian/Ubuntu еквивалента би бил:

 apt-get install build-essential 

След това е нужно да свалите последната версия на OpenSSL от техния сайт.

Първо влизате в директорията /usr/local/src

 

 cd /usr/local/src 

 

 wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz 

 

Разархивирайте сваления Tar архив със следната команда:

 tar -zxfv openssl-1.0.2n.tar.gz -C /usr/local/ 

 

След което я достъпете:

 cd /usr/local/openssl-1.0.2n 

 

Време е да започнете с компилацията. Изпълнете следните команди в директорията, която достъпихте:

 ./config 
 make depend 
 make 
 make install 

 

Какво правят тези команди?

./config – Подготвя текущия софтуер за инсталация, като проверява дали всички зависимости в системата са подсигурени;

make depend – Обхожда всички source файлове в директорията и подсигурява техните зависимости;

make – Това е командата, с която всъщност build-ваме софтуера;

make install – Финалната стъпка и реалното инсталиране на софтуера, което поставя всички нужни файлове в необходимите директории.

 

Накрая остана само да влезе в сила новото binary за OpenSSL

 mv /usr/bin/openssl /usr/bin/openssl_1.0.1e 
 ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl 

 

Можете да тествате, като изпълните следната команда:

 openssl version 

 

Резултатът, който се очаква е:

 [root@delta openssl-1.0.2n]# openssl version
OpenSSL 1.0.2n 7 Dec 2017 

След като вече имате най-новия OpenSSL, сте готови да пристъпите към компилацията на NGINX. Свалете най-последната stable версия и я разархивирайте.

 cd /root && wget https://nginx.org/download/nginx-1.12.2.tar.gz 
 tar xvf nginx-1.12.2.tar.gz  && cd /root/nginx-1.12.2

 

Преди да пристъпите към компилирането е необходимо да инсталирате няколко пакета, които са нужни зависимости.

 yum install libxml2-devel libxslt-devel gd-devel geoip-devel gperftools-devel 

 

Сега е време да компилирате nginx. Използвайте следните флагове:

./configure --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/usr/share/nginx/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/usr/share/nginx/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/scgi --user=nginx --group=nginx --build="TFO and ALPN custom build" --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-openssl=/usr/local/openssl-1.0.2n --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-google_perftools_module --with-pcre --with-pcre-jit --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DTCP_FASTOPEN=23' --with-ld-opt='-Wl,-z,relro -Wl,-E'

След като премине успешно configure, изпълнете следните команди:

 make && make install 

 

Това ще компилира и инсталира вашия nginx. Ако всичко е преминало успешно, остават няколко малки неща, за да завършите напълно инсталацията.

Изпълнете следните команди, за да може nginx binary-то да бъде във вашия PATH. Също така, добавете потребител nginx, за да може самият service да работи с него и създайте една нужна директория, за да може базовата ви конфигурация да сработи от раз.

ln -s /usr/share/nginx/sbin/nginx /usr/sbin/nginx

useradd -r -s /bin/false nginx

mkdir -p /usr/share/nginx/var/lib/nginx/tmp/client_body

Последната стъпка е да добавите service файл в systemd директорията, за да можете да управлявате nginx през systemctl

vim /etc/systemd/system/multi-user.target.wants/nginx.service

 

Вътре поставете следното съдържание:


[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target

 

Редактирайте и още един файл:

 vim /usr/lib/systemd/system/nginx.service 

 

Вътре поставете следното съдържание:


[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target\

Остана само да редактирате nginx.conf файла, за да зададете място за неговия PID файл.

 vim /etc/nginx/nginx.conf 

 

Редактирайте pid, така че да стане:

 pid /run/nginx.pid; 

 

Готови сте да пристъпите към пускането на вашия завършен nginx

 [root@delta]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

 

Ако резултатът е такъв, сте готови да пуснете nginx

 service nginx start 

 

Може да посетите IP адреса на сървъра, за да видите дали nginx ви приветства с welcome screen-a си.

nginx-welcome-screen

options

След като вашият nginx е инсталиран и готов, може да пуснете http2, tcpfastopen както и да тествате ALPN.

Да речем, че сте конфигурирали виртуален хост с име nginx.delta.bg и сте издали SSL сертификат през letsencrypt. Директивата в .conf файла на виртуалния хост, с която включвате support-a за http2 и tcpfastopen е:

 listen 79.98.111.3:443 ssl http2 fastopen=23; 

 

Рестартирайте nginx

 service nginx restart 

 

И сега е време да видите как изглеждат нещата при вас. Ние тестваме, използвайки online tool за това.

http2-test

Както може да видите тук, уеб сървърът поддържа http 2.0 както и full ALPN support.

 

Какво правят тези директиви, описани по горе?

listen 79.98.111.3:443 – Това е директивата, която описва кой IP адрес ще слуша и на кой порт. IP адреса на сървъра в случая е 79.98.111.3 а порта е 443 (стандартният за https);

ssl – Директива, която оказва, че това е listener със https;

http2 – Това е директивата, която активира http2 поддръжката. Без нея уеб сървъра ще сервира всичко през http1.1;

fastopen=23 – Това е директивата, която пуска tcpfastopen. Може да активирате tcpfastopen за един виртуален хост, на един IP адрес. Ако искате да го активирате за втори виртуален хост, той трябва да слуша на друг IP адрес.

С това вашата инсталация и конфигурация на nginx с ALPN, http2.0 и tcpfastopen е завършена.

Leave a Reply

Your email address will not be published. Required fields are marked *