Nginx veebiserveri kasutamine operatsioonisüsteemiga Debian
Sissejuhatus
Nginx ehk Engine X http://nginx.org/ veebiserver ..
Tarkvara paigaldamine
Debian v. 7 Wheezy sisaldab paketihaldusest Nginx v. 1.2.1, mille paigaldamiseks sobib öelda
# apt-get install nginx
kusjuures on sellised alternatiivid
- nginx-extras - sisaldab enim mooduleid, mh Lua tugi
# apt-cache show nginx-extras ... STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, Charset, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, Limit Requests, Limit Zone, Log, Map, Memcached, Proxy, Referer, Rewrite, SCGI, Split Clients, SSI, Upstream, User ID, UWSGI. OPTIONAL HTTP MODULES: Addition, Debug, Embedded Perl, FLV, GeoIP, Gzip Precompression, Image Filter, IPv6, MP4, Random Index, Real IP, Secure Link, SSL, Stub Status, Substitution, WebDAV, XSLT. MAIL MODULES: Mail Core, IMAP, POP3, SMTP, SSL. THIRD PARTY MODULES: Auth PAM, Chunkin, DAV Ext, Echo, Embedded Lua, HttpHeadersMore, http push, Nginx Development Kit, Upload module, Upload Progress, Upstream Fair Queue.
- nginx-full - vaikimisi
- nginx-light - sisaldab kõige vähem mooduleid
- nginx-naxsi
Tööpõhimõte
- non-blocking
- modulaarne
Moodulid
- Core
- http
- rewrite
- TODO
Seadistamine
Veebiserveri tööd juhib seadistusfail /etc/nginx/nginx.conf, nt sellise sisuga
user www-data; worker_processes 4; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 2048; # multi_accept on; } http { include /etc/nginx/mime.types; access_log /var/log/nginx/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; server_tokens off; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
kus
- worker_processes - mitu protsessi töötab
- worker_connections - kui palju samaaegseid tcp ühendusi üks protsess teenindab maksimaalselt
- includetakse seadistusfailid kahest kataloogist
Virtual hostile vastav seadistusfail on /etc/nginx/sites-enabled/www.loomaaed.tartu.ee.conf
server { listen 80; server_name www.loomaaed.tartu.ee; access_log /var/log/nginx/www.loomaaed.tartu.ee-access.log; root /var/www; error_page 404 /index.html; location / { index index.html; } location ~* \.html$ { expires 3m; add_header Cache-Control "must-revalidate"; } location ~* \.(js|css|gif|jpg|png|ico)$ { expires 60m; add_header Cache-Control "public"; } }
Nginx käivitamine ja seiskamine toimub käivitusskriptiga
# /etc/init.d/nginx stop|start
Tulemusena töötavad sellised protsessid
root 1158 0.0 0.1 78300 1388 ? Ss 17:11 0:00 nginx: master process /usr/sbin/nginx www-data 1159 0.0 0.2 78640 1688 ? S 17:11 0:00 \_ nginx: worker process www-data 1160 0.0 0.2 78640 1688 ? S 17:11 0:00 \_ nginx: worker process www-data 1161 0.0 0.2 78640 1688 ? S 17:11 0:00 \_ nginx: worker process www-data 1162 0.0 0.2 78640 1688 ? S 17:11 0:00 \_ nginx: worker process
Haldamine
TODO
Memcache
Kasulikud materjalid
- http://blog.martinfjordvald.com/2010/09/12000-requests-per-second-with-nginx-php-and-memcached/
- http://blog.martinfjordvald.com/2011/02/implementing-full-page-caching-with-nginx-and-php/
HTTP revers proksimine
Kõige lihtsamal juhul proxib üks Nginx edasi ühendusi ühele http backend serverile (nt Apahce) kasutades sellist sektsiooni
server { listen 80; server_name www.loomaaed.tartu.ee; location / { proxy_pass http://www.loomaaed.tartu.ee; } }
kus
- nginx arvutis nt /etc/hosts abil lahendub www.loomaaed.tartu.ee domeeninimi http backend server ip aadressiks
Kui sama Nginx peab proksima mitut veebikohta, siis tuleb sarnaseid sektsioone kasutada mitut, erinevate domeenimedega, nt
server { listen 80; server_name www.loomaaed.tartu.ee; location / { proxy_pass http://www.loomaaed.tartu.ee; } } server { listen 80; server_name www.imool.org; location / { proxy_pass http://www.imool.org; } }
Kui soovitakse kasutada ühe veebiteenuse juures mitut backend serverit siis tuleb kirjeldada nn upstream komponendid ja server sektsioonist viidatakse kirjeldatud upstreamile, nt
server { listen 80; server_name www.loomaaed.tartu.ee; location / { proxy_pass http://upstream_auul; } }
ning vastav upstream kirjeldus
upstream upstream_auul { server 10.10.1.10:80; server 10.10.1.11:80; server 10.10.1.12:80; }
Lisaks on proksimisel tõenäoliselt kasu backendile saadetavatele päringutele lisada x-forwarded-for http päis, lisades 'server' sektsiooni
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Kokku nt sedasi
server { listen 80; server_name www.moraal.ee; location / { proxy_set_header Host $http_host; proxy_set_header X-FRONT-END-HTTPS off; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://192.168.1.14; } }
kus
- proxy_set_header Host $http_host - backendile päringu esitamisel kasutatakse 'server_name' parameetri väärtust Host päises
- lisatakse custom header X-FRONT-END-HTTPS
Cache
TODO
Lua
Lua tugi sisaldub nginx-extras paketis ja kasutada saab nt selliselt
location / { try_files $uri $uri/ /index.html; header_filter_by_lua ' ngx.header["Expires"] = ngx.http_time( ngx.time() + 31536000 ); ngx.header["Cache-Control"] = "max-age=31536002"; '; }
XSLT
TODO
FastCGI
Tundub, et NginX jaoks (või pigem, üldiselt) on mitmeid FastCGI mootoreid, nt fcgiwrap
# apt-get install fcgiwrap
CGI kasutamiseks sobib NginX seadistusfaili lisada sektsioon
location /cgi-bin/ { gzip off; root /usr/lib; fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params; }
tulemusena töötab skript
# cat /usr/lib/cgi-bin/cgi.cgi #!/usr/bin/perl -w print "Content-type: text/html\n\n"; print "Hello World";
aadressil http://nginx.moraal/cgi-bin/cgi.cgi
PHP-FPM
PHP kasutamiseks tuleb paigaldada php5-fpm (Fast Process Manager)
# apt-get install php5-fpm php5-cgi
FPM esineb isesesivalt töötava protsessi kujul, millele nginx seadistustest viidataks nt nii
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
FPM tööd juhivad seadistusfailid
# find /etc/php5/fpm -type f /etc/php5/fpm/php.ini /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/php-fpm.conf
AJP
TODO
https kasutamine
Seadistusfail on sarnane http seadistusfaili vastavale osale, lisaks on https jaoks iseloomulikud parameetrid (šiffrid, sertifikaat-võti jme)
server { listen 443; server_name localhost; root /usr/share/nginx/html; index index.html index.htm; ssl on; ssl_certificate www.loomaaed.tartu.ee.crt; ssl_certificate_key www.loomaaed.tartu.ee.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP; ssl_prefer_server_ciphers on; location / { try_files $uri $uri/ =404; } }
kus
- dhparam.pem genereerimiseks
# apt-get install rng-tools # openssl dhparam -out dhparam.pem 4096
- ssl_certificate - sisaldab sertifikaati või lisaks ka ahelat (järjekorras sertifikaat ja sealt edasi juurika poole; reeglina juur sertifikaati serveri poolel ei kasutata)
Kasulikud lisamaterjalid
Kliendi sertifikaadi kasutamine
TODO
nginx_status
/nginx_status näitab midagi apache /server-status sarnast kasutades virtuaalse hosti juures
location /nginx_status { stub_status on; access_log off; allow 192.168.10.0/24; deny all; }
Väljundi tõlgendamist õpetab https://www.keycdn.com/support/nginx-status
Tuunimine
Sellistest muudatustest võib olla abi
sysctl net.ipv4.ip_local_port_range sysctl fs.file-max sysctl net.core.somaxconn sysctl net.ipv4.tcp_window_scaling sysctl net.ipv4.tcp_max_syn_backlog sysctl -w net.ipv4.tcp_max_syn_backlog=3240000 sysctl -w net.core.somaxconn=3240000 sysctl net.ipv4.tcp_max_tw_buckets=1440000 sysctl -w net.ipv4.tcp_max_tw_buckets=1440000 sysctl net.core.rmem_max sysctl net.core.rmem_default sysctl -w net.core.rmem_default=8388608 sysctl -w net.core.rmem_max=16777216 sysctl net.core.wmem_max sysctl net.core.wmem_max=16777216 sysctl -w net.ipv4.tcp_rmem sysctl net.ipv4.tcp_rmem sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216" sysctl -w net.ipv4.tcp_wmem="4096 87380 16777216" sysctl net.ipv4.tcp_congestion_control sysctl net.netfilter.nf_conntrack_max sysctl -w net.netfilter.nf_conntrack_max=131072 sysctl net.ipv4.tcp_syncookies sysctl -w net.ipv4.tcp_syncookies=1
Tundub, et see ei mõju siitkaudu nginx'ile
# grep www-data /etc/security/limits.conf www-data soft nofile 200000 www-data hard nofile 200000
Seadistusfailis
user www-data; worker_processes 36; pid /var/run/nginx.pid; worker_rlimit_nofile 200000; events { worker_connections 16000; multi_accept on; use epoll; } http { open_file_cache max=200000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 30; types_hash_max_size 2048; keepalive_requests 100; reset_timedout_connection on; client_body_timeout 10; send_timeout 2; access_log off; error_log /var/log/nginx/error.log; gzip off; gzip_disable "msie6"; }
SNI
TODO
Kasulikud materjalid
HSTS
Kasulikud lisamaterjalid
HPKP
NginX
TODO
Apache
Sertifikaadi digest arvutamine
# openssl x509 -pubkey < hpkp-test.moraal.ee.pem | openssl pkey -pubin -outform der \ | openssl dgst -sha256 -binary | base64
CSR digest arvutamine
# openssl req -pubkey < hpkp-test.moraal.ee.csr | openssl pkey -pubin -outform der \ | openssl dgst -sha256 -binary | base64
Arvutatud digestite kasutamiseks tuleb nad lisada Apache seadistusfaili nii
Header set Public-Key-Pins 'pin-sha256="fNB+07VBLo6H7199skBeCN0OWYEDL4sCa0IGicVUvys="; \ pin- sha256="dP92V9GaJ6vqLDdeaYfGBZYhvvyIRcxqinijNchQYew="; max-age=300'
Reeglina lisatakse üks töötava serdig digest ja üks või enam tagavara digestit, mis on arvutatud csr'i public võtmele.
Tulemuse kontrollimine
- https://www.ssllabs.com/ssltest/
- wget --server-response https://hpkp-test.moraal.ee/
Kasulikud lisamaterjalid
Misc
- HTTP POST suuruse seadistamine (vaikimisi on see vist 1 MB)
server { listen 443; .. client_max_body_size 25m; ... }
Geo kasutamine
Selleks, et näitada ühelt ip aadressilt pöördujale nö tavalist proksitud sisu ja kõigile muudele muud sisu sobib kasutada sellist server direktiivi lõiku
.. root /var/www/html ... location / { error_page 404 /wiki_hooldus.html; error_page 403 /wiki_hooldus.html; proxy_set_header Host $http_host; proxy_set_header X-FRONT-END-HTTPS on; proxy_set_header HTTPS on; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto https; if ( $remote_addr = 192.168.10.219 ) { proxy_pass http://192.168.1.15; } } ....
Osutub, et ei olegi niisama lihtne esitada veebikohast ühte sisu mingitest subnettidest pöördujale ja muud sisu kõikjalt mujalt pöördujatele. Geo mooduli abil saab seda teha sellise seadistusega
.. geo $geo { default 0; 192.168.10.0/24 1; 192.168.1.0/24 1; } server { ... root /var/www/html location / { error_page 404 /wiki_hooldus.html; error_page 403 /wiki_hooldus.html; proxy_set_header Host $http_host; proxy_set_header X-FRONT-END-HTTPS on; proxy_set_header HTTPS on; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto https; if ( $geo ) { proxy_pass http://192.168.1.15; } } .... }
kus
- if tingimus argument $geo väärtustatakse vaikimie $remote_addr väärtusega ja seejärel kontrollitakse milline sektsioon 'geo' rida teda tabab; ja tagastatakse rea teisel positsioonil olev väärtus
- kui see on '1', siis tingimus on tõene ja toimub proxy_pass; vastasel korral kasutatakse server sektsioonis olevat /var/www/html sisu lokaalselt.
Misc 2020