Nginx veebiserveri kasutamine operatsioonisüsteemiga Debian

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 4. juuli 2021, kell 19:33 kasutajalt Imre (arutelu | kaastöö) (Uus lehekülg: '===Sissejuhatus=== Nginx ehk Engine X http://nginx.org/ veebiserver .. ===Tarkvara paigaldamine=== Debian v. 7 Wheezy sisaldab paketihaldusest Nginx v. 1.2.1, mille paigaldami...')
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribaleMine otsikasti

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 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

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


Kasulikud materjalid