nginx php Zdradziłem apache na rzecz nginx   niezła suka ! :)

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)

php nginx fpm 200x200 Zdradziłem apache na rzecz nginx   niezła suka ! :)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

apc nginx php 200x200 Zdradziłem apache na rzecz nginx   niezła suka ! :)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

related

Tagged with:  
Share →

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>