Różnice między wybraną wersją a wersją aktualną.
Poprzednia wersja | |||
— | nginx [2018/07/16 11:47] (aktualna) – edycja zewnętrzna 127.0.0.1 | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
+ | ===== Wstęp ===== | ||
+ | Ostatnio przeszedłem z Apache na Nginx' | ||
+ | |||
+ | ===== Instalacja ===== | ||
+ | |||
+ | poldek:/ | ||
+ | |||
+ | ===== Konfiguracja ===== | ||
+ | |||
+ | Opis pliku konfiguracji **/ | ||
+ | < | ||
+ | user nginx nginx; | ||
+ | worker_processes | ||
+ | error_log | ||
+ | pid / | ||
+ | </ | ||
+ | Kolejno: | ||
+ | * pierwsza linia definiuje na jakim użytkowniku ma być uruchomiona usługa, | ||
+ | * worker_process - ile ma być uruchomionych wątków Nginx' | ||
+ | * error_log definiuje plik, gdzie będą zapisywane błędy, | ||
+ | * pid - gdzie ma być zapisywany process ID - nie zmieniamy. | ||
+ | < | ||
+ | events { | ||
+ | worker_connections | ||
+ | use epoll; | ||
+ | } | ||
+ | </ | ||
+ | Worker_connections - ilość requestów na wątek. | ||
+ | < | ||
+ | http { | ||
+ | include | ||
+ | default_type | ||
+ | |||
+ | log_format | ||
+ | '" | ||
+ | '" | ||
+ | access_log | ||
+ | sendfile | ||
+ | tcp_nopush | ||
+ | tcp_nodelay | ||
+ | server_names_hash_bucket_size | ||
+ | types_hash_max_size | ||
+ | types_hash_bucket_size | ||
+ | # | ||
+ | keepalive_timeout | ||
+ | limit_zone | ||
+ | #gzip on; | ||
+ | server { | ||
+ | listen | ||
+ | server_name | ||
+ | access_log | ||
+ | client_max_body_size | ||
+ | |||
+ | location / { | ||
+ | autoindex | ||
+ | root / | ||
+ | index | ||
+ | limit_conn | ||
+ | } | ||
+ | |||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # } | ||
+ | # | ||
+ | # | ||
+ | # } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Sekcja http: | ||
+ | * log_format - definiujemy jak ma wyglądać wpis w logach - listę zmiennych znajdziemy tu: http:// | ||
+ | * access_log - plik gdzie zapisujemy logi, | ||
+ | * gzip - kompresja (opis niżej), | ||
+ | |||
+ | Sekcja server: | ||
+ | * listen - na jakim porcie ma nasłuchiwać vhost, pierwszy vhost jest domyslnym vhostem, możliwe kombinacje co do portu i adres IP to: listen IP:port; gdzie * = 0.0.0.0 (np *:80), | ||
+ | * server_name - definiujemy vhost' | ||
+ | * location / - tu ustawiamy opcje dotyczącego katalogu root w vhoście, | ||
+ | * autoindex - on włącza tworzenie się autoindeksów, | ||
+ | * root - definiowania katalogu root dla danego vhost' | ||
+ | * index - tu definiujemy domyslne pliki, które będą otwierane po wejściu do katalogu, | ||
+ | * location / | ||
+ | * error_page - definiowanie plików w przypadku błędów - 404, 500, itp, | ||
+ | * location ~ \.php$ - definiowanie obsługi plików PHP przez demona FastCGI (opis niżej). | ||
+ | |||
+ | Wszelkie zmiany powinny zostać przetestowane składniowo przez Nginx' | ||
+ | $ nginx-light -t | ||
+ | |||
+ | i powinna ona zwrócic coś takiego: | ||
+ | |||
+ | $ the configuration file / | ||
+ | $ configuration file / | ||
+ | |||
+ | w przypadku błędu pojawi się informacja gdzie jest błąd. | ||
+ | |||
+ | Logi z błędami w krótkim czasie robią się bardzo duże - to głównie za sprawą różnego rodzaju botów. Przydatną opcją jest wyłączenie logownia próby pobrania plików/ | ||
+ | < | ||
+ | http { | ||
+ | ... | ||
+ | | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== IPv6 ==== | ||
+ | |||
+ | Najpierw trzeba sprawdzić czy Nginx został skompilowany z opcją --with-ipv6. Aby to sprawdzić wykonajmy: | ||
+ | $ nginx-light -V | ||
+ | |||
+ | Jeśli Nginx obsługuje IPv6 to w sekcji serwer danego vhosta modyfikujemy listen: | ||
+ | < | ||
+ | listen | ||
+ | </ | ||
+ | |||
+ | taki wpis oznacza, że serwer nasłuchuje na IPv4 oraz IPv6, jeśli chcemy, aby tylko i wyłącznie nasłuchiwał na IPv6 ustawiamy: | ||
+ | < | ||
+ | listen | ||
+ | </ | ||
+ | zamiast [::] możemy podać adres (np: [ffff: | ||
+ | |||
+ | ==== SSL ==== | ||
+ | |||
+ | Tworzymy certyfikaty SSL. Aby to zrobić trzeba zainstalować narzędzia Openssl' | ||
+ | |||
+ | $ install openssl-tools | ||
+ | |||
+ | Generowanie certyfikatów: | ||
+ | |||
+ | $ openssl genrsa -out / | ||
+ | $ openssl req -new -x509 -days 365 -key / | ||
+ | $ chmod 600 / | ||
+ | |||
+ | Do sekcji http dopisujemy: | ||
+ | < | ||
+ | ssl_certificate | ||
+ | ssl_certificate_key | ||
+ | </ | ||
+ | w sekcji **server** głównego vhosta wpisujemy: | ||
+ | < | ||
+ | listen | ||
+ | </ | ||
+ | w przypadku IPv6: | ||
+ | < | ||
+ | listen | ||
+ | </ | ||
+ | w kolejnych vhostach wystarczy wpisać: | ||
+ | < | ||
+ | listen | ||
+ | </ | ||
+ | Oczywiście każdy vhost może mieć osobny certyfikat, np: | ||
+ | < | ||
+ | server { | ||
+ | ... | ||
+ | | ||
+ | | ||
+ | | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | server { | ||
+ | ... | ||
+ | | ||
+ | | ||
+ | | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Vhosty ==== | ||
+ | |||
+ | Domyślnie działa nam główny vhost - czyli domyślny. Aby utworzyć kolejnego trzeba dodać do konfiguracji kolejną sekcje **server** w sekcji **http**. Aby mieć porządek w pliku konfiguracji polecam dodanie na końcu sekcji **http** (przed **}**) opcji: | ||
+ | < | ||
+ | include | ||
+ | </ | ||
+ | która będzie dodawała konfiguracje z plików (z rozszerzeniem **conf**) z katalogu **/ | ||
+ | |||
+ | $ mkdir / | ||
+ | $ chmod 700 / | ||
+ | |||
+ | Przykładowy konfig vhosta: | ||
+ | < | ||
+ | server { | ||
+ | listen | ||
+ | server_name | ||
+ | access_log | ||
+ | error_log | ||
+ | |||
+ | location / { | ||
+ | autoindex on; | ||
+ | root / | ||
+ | index | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Z czasem on się zmieni w zależności co będziemy chcieli osiągnąć w danym vhoście. | ||
+ | |||
+ | ==== CGI ==== | ||
+ | |||
+ | CGI będzie nam potrzebne, aby uruchomić np Mailman' | ||
+ | |||
+ | poldek:/ | ||
+ | |||
+ | Ściągamy i kompilujemy **FcgiWrap**: | ||
+ | | ||
+ | $ mkdir ~/install | ||
+ | $ cd ~/install | ||
+ | $ git clone git:// | ||
+ | $ cd fcgiwrap | ||
+ | $ ./configure | ||
+ | $ make | ||
+ | |||
+ | Jeśli podczas make będziecie mieć taki błąd: | ||
+ | fcgiwrap.c: | ||
+ | edytujemy plik **fcgiwrap.c** i zmieniamy w nim **linię nr 30** z: | ||
+ | < | ||
+ | #include < | ||
+ | </ | ||
+ | na: | ||
+ | < | ||
+ | #include < | ||
+ | </ | ||
+ | |||
+ | Po skompilowaniu kopiujemy binarkę do **/ | ||
+ | |||
+ | $ cp ~/ | ||
+ | |||
+ | Tworzymy plik **/ | ||
+ | < | ||
+ | # | ||
+ | |||
+ | use strict; | ||
+ | use warnings FATAL => qw( all ); | ||
+ | |||
+ | use IO:: | ||
+ | |||
+ | my $bin_path = '/ | ||
+ | my $socket_path = $ARGV[0] || '/ | ||
+ | my $num_children = $ARGV[1] || 1; | ||
+ | |||
+ | close STDIN; | ||
+ | |||
+ | unlink $socket_path; | ||
+ | my $socket = IO:: | ||
+ | Local => $socket_path, | ||
+ | Listen => 100, | ||
+ | ); | ||
+ | |||
+ | die " | ||
+ | |||
+ | for (1 .. $num_children) { | ||
+ | my $pid = fork; | ||
+ | die " | ||
+ | next if $pid; | ||
+ | |||
+ | exec $bin_path; | ||
+ | die " | ||
+ | } | ||
+ | </ | ||
+ | Nadajemy odpowiednie uprawnienia: | ||
+ | $ chmod 750 / | ||
+ | $ chown root:nginx / | ||
+ | |||
+ | Uruchamiamy: | ||
+ | $ sudo -u nginx / | ||
+ | $ chmod 770 / | ||
+ | |||
+ | Dodpisujemy na koniec pliku **/ | ||
+ | |||
+ | Przykładowa konfiguracja vhosta Mailmana: | ||
+ | < | ||
+ | server { | ||
+ | listen | ||
+ | listen | ||
+ | |||
+ | server_name | ||
+ | access_log | ||
+ | error_log | ||
+ | |||
+ | root / | ||
+ | |||
+ | location = / { | ||
+ | rewrite ^ / | ||
+ | } | ||
+ | |||
+ | location / { | ||
+ | rewrite ^ / | ||
+ | } | ||
+ | |||
+ | location ~ ^/ | ||
+ | fastcgi_split_path_info (^/ | ||
+ | include fastcgi.params; | ||
+ | fastcgi_param GATEWAY_INTERFACE CGI/1.1; | ||
+ | fastcgi_param SCRIPT_FILENAME $document_root$1; | ||
+ | fastcgi_param PATH_INFO $fastcgi_path_info; | ||
+ | fastcgi_param PATH_TRANSLATED $document_root$2; | ||
+ | fastcgi_pass unix:/ | ||
+ | } | ||
+ | |||
+ | location /icons { | ||
+ | alias / | ||
+ | } | ||
+ | |||
+ | location / | ||
+ | alias / | ||
+ | autoindex on; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== PHP ==== | ||
+ | |||
+ | Instalujemy PHP'a: | ||
+ | |||
+ | poldek:/ | ||
+ | |||
+ | Ustawiamy zmienne w pliku **/ | ||
+ | < | ||
+ | pid = run/ | ||
+ | daemonize = yes | ||
+ | listen = 127.0.0.1: | ||
+ | listen.allowed_clients = 127.0.0.1 | ||
+ | user = nginx | ||
+ | group = nginx | ||
+ | pm = dynamic | ||
+ | pm.min_spare_servers = 5 | ||
+ | pm.max_spare_servers = 35 | ||
+ | </ | ||
+ | |||
+ | Tworzymy strukturę katalogów pod vhosta: | ||
+ | $ mkdir -p / | ||
+ | $ mkdir -p / | ||
+ | $ chmod -R 750 / | ||
+ | $ chmod -R 770 / | ||
+ | $ chown -R user:http / | ||
+ | |||
+ | Tworzymy plik **/ | ||
+ | < | ||
+ | server { | ||
+ | listen | ||
+ | server_name | ||
+ | access_log | ||
+ | error_log | ||
+ | |||
+ | location / { | ||
+ | root / | ||
+ | index | ||
+ | } | ||
+ | |||
+ | location ~ \.php$ { | ||
+ | include | ||
+ | fastcgi_pass | ||
+ | fastcgi_index | ||
+ | fastcgi_param | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Tworzymy katalog na konfigurację paramterów PHP'a dla vhostów: | ||
+ | |||
+ | $ mkdir / | ||
+ | $ chmod 700 / | ||
+ | |||
+ | Tworzymy plik **/ | ||
+ | < | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | # PHP only, required if PHP was built with --enable-force-cgi-redirect | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | upload_tmp_dir=/ | ||
+ | session.save_path=/ | ||
+ | sendmail_path='/ | ||
+ | </ | ||
+ | Robimy reload Nginx' | ||
+ | |||
+ | $ / | ||
+ | |||
+ | Gdy normalne strony działają, a w PHP nie chcą - pisze np: **Bad Gateway** to najpierw sprawdźmy czy konfiguracja PHP'a jest dobra. Sprawdzić możemy prostym przykładem: | ||
+ | |||
+ | $ echo "<? | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== PERL ==== | ||
+ | |||
+ | czekam aż ktoś kopnie nowszą wersję perla do repo wtedy dokończe z wraperem perla. | ||
+ | |||
+ | ==== Statystyki ==== | ||
+ | |||
+ | W konfiguracji Nginx' | ||
+ | |||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Czasem bywa tak, że danego vhosta możemy odpytywać nie z localhost' | ||
+ | |||
+ | Tworzymy plik nginx_vhost.ltd.conf: | ||
+ | < | ||
+ | # | ||
+ | # Nginx stat | ||
+ | # | ||
+ | # connections | ||
+ | |||
+ | WorkDir: / | ||
+ | |||
+ | Target[nginx_con]: | ||
+ | Options[nginx_con]: | ||
+ | Title[nginx_con]: | ||
+ | MaxBytes[nginx_con]: | ||
+ | YLegend[nginx_con]: | ||
+ | ShortLegend[nginx_con]: | ||
+ | LegendI[nginx_con]: | ||
+ | LegendO[nginx_con]: | ||
+ | Legend1[nginx_con]: | ||
+ | Legend2[nginx_con]: | ||
+ | PageTop[nginx_con]: | ||
+ | # requests | ||
+ | Target[nginx_req]: | ||
+ | Options[nginx_req]: | ||
+ | Title[nginx_req]: | ||
+ | MaxBytes[nginx_req]: | ||
+ | YLegend[nginx_req]: | ||
+ | ShortLegend[nginx_req]: | ||
+ | Legend1[nginx_req]: | ||
+ | Legend2[nginx_req]: | ||
+ | LegendI[nginx_req]: | ||
+ | LegendO[nginx_req]: | ||
+ | PageTop[nginx_req]: | ||
+ | </ | ||
+ | |||
+ | Do pliku **/ | ||
+ | < | ||
+ | # | ||
+ | # $Revision: 2 $ | ||
+ | # $Date: 2008-09-12 15:11:40 +0300 (Fri, 12 Sep 2008) $ | ||
+ | |||
+ | my %opt = ( | ||
+ | # http link to nginx stub_status, | ||
+ | nginx_status | ||
+ | # path for program what may dump web page, normaly lynx -dump | ||
+ | # lynx => 'lynx -dump', | ||
+ | lynx => 'wget -q -Y off -O -', | ||
+ | ); | ||
+ | |||
+ | $opt{var} = $ARGV[0] if $ARGV[0]; | ||
+ | $opt{nginx_status} = $ARGV[1] if $ARGV[1] and $ARGV[1]=~/ | ||
+ | $opt{var} ||= ''; | ||
+ | |||
+ | my $do = `$opt{lynx} $opt{nginx_status}`; | ||
+ | |||
+ | if ($opt{var} eq ' | ||
+ | $do=~/ | ||
+ | $opt{d2} = $opt{d1} = $1; | ||
+ | } | ||
+ | elsif ($opt{var} eq ' | ||
+ | $do=~/ | ||
+ | $opt{d2} = $opt{d1} = $3; | ||
+ | } | ||
+ | #elsif { $do=~/ | ||
+ | else { | ||
+ | $opt{var} = ' | ||
+ | $opt{d2} = $opt{d1} = 0; | ||
+ | warn " | ||
+ | } | ||
+ | |||
+ | print " | ||
+ | print " | ||
+ | #print " | ||
+ | print "Nginx $opt{var}\n"; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Inne ===== | ||
+ | |||
+ | **HTTP Auth**: | ||
+ | < | ||
+ | server { | ||
+ | ... | ||
+ | location / { | ||
+ | ... | ||
+ | auth_basic | ||
+ | auth_basic_user_file | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Plik **/ | ||
+ | $ wget http:// | ||
+ | $ mv ./ | ||
+ | $ chmod 755 ./ | ||
+ | |||
+ | Aby plik działał musimy mieć zainstalowany pakier **python-modules**: | ||
+ | |||
+ | poldek:/ | ||
+ | |||
+ | Uruchamiamy wg składni: | ||
+ | |||
+ | $ ./ | ||
+ | |||
+ | **HTTP -> HTTPS**: | ||
+ | |||
+ | < | ||
+ | server { | ||
+ | ... | ||
+ | listen 80; | ||
+ | rewrite | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | server { | ||
+ | ... | ||
+ | listen 443; | ||
+ | fastcgi_param HTTPS on; | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | **Zend**: | ||
+ | < | ||
+ | server { | ||
+ | ... | ||
+ | location / { | ||
+ | ... | ||
+ | if (!-f $request_filename) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ |