
Nginx – wiki: serwer WWW (HTTP) oraz serwer proxy dla HTTP i IMAP/POP3 tworzony przez Igora Sysojewa. Zaprojektowany z myślą o wysokiej dostępności i silnie obciążonych serwisach (nacisk na skalowalność i niską zajętość zasobów). Wydawany jest na licencji BSD.
Tam gdzie Apache nie wyrobi, tam nginx’a poślą.
W poprzednim poście przytoczyłem jeden z wykonanych projektów, dotyczył on wydajnego systemu poczty bazującego na najlepszej na świecie (hehe) dystrybucji Linuxa – Slackware. A że w projekcie mogą wystąpić różne nieoczekiwane perturbacje – zrzucając winę na projektantów – należało wdrożyć plan B. Planu B potencjalnie nie było, ale powstał dość szybko. Przekonałem Mariusza do uruchomienia nginx (wym. endżinix) do wykonania loadbalancera (reverse proxy) jak i serwera www obsługującego zapytania pochodzące od użytkowników pragnących skorzystania z systemu webmail. W godzinach szczytu w jednym momencie korzysta z systemu webmail od 400 do 600 użytkowników, co w wypadku jednego serwera jest wąskim gardłem. Przypominam, że w projekcie założyliśmy najwyższą wydajność – szybkość.
NGINX (1.0.4) + PHP (5.3.6 incl php-fpm / fastcgi) z obsługą MySQL + APC dla Slackware 13.37 (32bit)
Post-Sowiecki projekt prowadzony od 2004 roku przez Igora Sysojew, zyskuje coraz większą popularność, głównie w środowiskach gdzie mało wydajny Apache nie radzi sobie najlepiej. Coś jest na rzeczy, skoro wg. statystyk plasuje się na III miejscu, tuż po Apache (I) i IIS (II). Tyle na początek.
Zacznę może od najistotniejszej informacji, otóż na stronie php-fpm.org widnieje informacja o wpięciu źródeł SAPI FPM do oficjalnego drzewa PHP, tak więc źródła nie wymagają patchowania. Szkoda że na głównej stronie tej informacji nie ma, tylko w Changelogu i dziale download drobnym maczkiem.
PHP-FPM is finally in PHP core!It is based off of the 0.6.x series in Launchpad,and is now the „officially” supported release. All the different versions of PHP-FPM are below.
Alternative PHP Cache, w skrócie APC
Bynajmniej nie chodzi o zasilacz awaryjny, a o akcelerację PHP. W sieci można znaleźć znaczną ilość artykułów poświęconych akceleratorom APC, eAccelerator jak również XCache zawierającym benchmarki i pokazujące ponad pięciokrotne przyśpieszenie względem samego php. Od dłuższego czasu używam tego pierwszego z WordPressem i chwalę sobie.
Po właściwie wykonanej instalacji akceleratora APC, należy pamiętać aby włączyć go, parametrem w pliku konfiguracyjnym php ini dodając linię w części extensions:
extension=apc.so
W przeciwnym razie, po wejściu do statystyk (w źródłach jest załączony plik apc.php) ukaże się komunikat APC does not appear to be running, co jest częstym błędem popełnianym podczas instalacji. Po dodaniu do php.ini, wystarczy wykonać restart php-fpm i voula. Aha, w phpinfo(); moduł jest wyszczególniony.
Warto zajrzeć do plku INSTALL w źródłach APC, w moim przypadku wersji 3.1.9:
Request that file in a web browser. If there is an entry for APC in the list of installed modules, the installation was successful. If APC is not listed, consult your web server error log. If it contains an error message saying that it can’t load the APC extension, your system might not be able to load shared libraries created with PHP’s build system. One alternative would be to compile APC statically into PHP. See the Quick Install (Static) instructions above.
Szybkie uruchomienie usługi
Pragnę zauważyć, że poniższa konfiguracja ma na celu weryfikację dostępu do usługi www z domyślnymi ustawieniami, co może znacznie przyczynić się do obniżenia bezpieczeństwa oraz braku stabilności systemu. Proszę o zapoznanie się z dokumentacją i zdeklarowanie parametrów wedle własnych potrzeb.
Domyślny plik konfiguracyjny dla /etc/nginx/nginx.conf:
user nobody;
worker_processes 1;
error_log /var/log/nginx/error.log;
#error_log /var/log/error.log notice;
#error_log /var/log/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_buffers 16 8k;
gzip_disable “MSIE [1-6].(?!.*SV1);
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root /var/www/htdocs;
index index.html index.htm index.php;
autoindex on;
create_full_put_path on;
}
#error_page 404 /404.html;
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root html;
#}
location ~ \.php$ {
include fastcgi_params;
root /var/www/htdocs;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
lnia 36 autoindex = on dla folderu /var/www/htdocs.
Domyślny plik konfiguracyjny /etc/php/php-fpm.conf:
;include=etc/fpm.d/*.conf [global] pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log ;log_level = notice ;emergency_restart_threshold = 0 ;emergency_restart_interval = 0 ;process_control_timeout = 0 ;daemonize = yes [www] ;prefix = /path/to/pools/$pool listen = 127.0.0.1:9000 ;listen.backlog = -1 listen.allowed_clients = 127.0.0.1 ;listen.owner = nobody ;listen.group = nobody ;listen.mode = 0666 user = nobody group = nobody pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 10 pm.max_requests = 50 ;pm.status_path = /status ;slowlog = log/$pool.log.slow ;chdir = /var/www ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;php_flag[display_errors] = off ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M
linia 14: możliwość zdefiniowania połączenia przez port / socket
linie 23-27: przy wzmożonym ruchu, parametry powinny zostać zmienione – RTFM ;-)
Pozostałe moduły (php.ini):
extension=apc.so extension=mysql.so extension=mysqli.so extension=bcmath.so extension=bz2.so extension=calendar.so extension=ctype.so extension=curl.so extension=dba.so extension=enchant.so extension=exif.so extension=ftp.so extension=gd.so extension=gettext.so extension=gmp.so extension=iconv.so extension=ldap.so extension=mbstring.so extension=openssl.so extension=pdo.so extension=pdo_mysql.so extension=pdo_sqlite.so extension=pspell.so extension=shmop.so extension=snmp.so extension=soap.so extension=sqlite.so extension=sqlite3.so extension=tokenizer.so extension=wddx.so extension=xsl.so extension=zip.so extension=zlib.so
Uruchomienie Akceleratora APC (php.ini):
[apc] apc.enabled = 1 apc.include_once_override = 0 apc.mmap_file_mask = /tmp/www_apc.XXXXXX apc.cache_by_default = 1 apc.canonicalize On apc.coredump_unmap = 0 apc.enable_cli = 0 apc.gc_ttl = 3600 apc.max_file_size = 1M apc.rfc1867_ttl = 3600 apc.shm_size = 120M apc.stat = 1 apc.ttl = 7200 apc.user_entries_hint = 1024 apc.user_ttl = 7200
dla WordPress apc.include_once_override = 0
Problemy
Gruszka dla Roundcube
PHP Fatal error: Class ‘Net_IDNA2′ not found in ….
*255 FastCGI sent in stderr: „PHP Fatal error: Class ‘MDB2′ not found in ….
# pear install MDB2 downloading MDB2-2.4.1.tgz ... Starting to download MDB2-2.4.1.tgz (119,790 bytes) ..........................done: 119,790 bytes install ok: channel://pear.php.net/MDB2-2.4.1 MDB2: Optional feature fbsql available (Frontbase SQL driver for MDB2) MDB2: Optional feature ibase available (Interbase/Firebird driver for MDB2) MDB2: Optional feature mysql available (MySQL driver for MDB2) MDB2: Optional feature mysqli available (MySQLi driver for MDB2) MDB2: Optional feature mssql available (MS SQL Server driver for MDB2) MDB2: Optional feature oci8 available (Oracle driver for MDB2) MDB2: Optional feature pgsql available (PostgreSQL driver for MDB2) MDB2: Optional feature querysim available (Querysim driver for MDB2) MDB2: Optional feature sqlite available (SQLite2 driver for MDB2) MDB2: To install optional features use "pear install pear/MDB2#featurename" # pear install pear/MDB2#mysql # pear install pear/MDB2#mysqli # pear install Net_IDNA2 channel://pear.php.net/Net_IDNA2-0.1.1
NULL for a ZEND_INI_PARSER_ENTRY
Przy uruchamianiu /etc/rc.d/rc.php-fpm z domyślnym plikiem konfiguracyjnym z /etc/php/php-fpm.conf, może pojawić się komunikat o błędzie:
ERROR: [/etc/php/php-fpm.conf:261] value is NULL for a ZEND_INI_PARSER_ENTRY
PHP: syntax error, unexpected ‘(‘ in Unknown on line 1
Najlepszym wyjsciem jest podmiana /etc/php/php-fpm.conf na /etc/php/php-fpm.conf.default. Pamiętać należy, że po takiej czynności należy zdefiniować parametry:
pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1
Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
albo utowrzyć katalog zgodnie z session.save_path i nadać mu uprawienia rw lub łatwiej zmienić na folder /tmp w php.ini
session.save_path = "/tmp"
PHP Warning: strtotime(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone set ting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Berlin’ for ‘CEST/2.0/DST’ instead in
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Europe/Warsaw
