Настройка web-сервера nginx, php-fpm на CentOS
Прежде всего nginx — простой, быстрый и надёжный сервер, не перегруженный функциями, который идеально подходит для сайтов-блогов и кроме того может служить как прокси-сервер перед другими серверами, например apache. В данной статье рассматривается настройка конфигурационных файлов, необходимых для работы nginx в связке с php-fpm, порядок действий следующий:
О том, как создать web-сервер на базе nginx, можно прочитать в статье Быстрая настройка web-сервера nginx на базе CentOSСохраним настройки по-умолчанию
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old
# cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.old
Глобальные настройки nginx
Файл /etc/nginx/nginx.conf:user nginx;
worker_processes 1;
timer_resolution 100ms;
worker_rlimit_nofile 8192;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/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 buffer=8k;
error_log /var/log/nginx/error.log;
# Caches information about open FDs, freqently accessed files.
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Базовые настройки
client_max_body_size 20m;
client_body_buffer_size 128k;
types_hash_max_size 2048;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Timeout for keep-alive connections. Server will close connections after this time.
keepalive_timeout 65;
# Number of requests a client can make over the keep-alive connection.
keepalive_requests 1000;
# Allow the server to close the connection after a client stops responding.
reset_timedout_connection on;
# При ошибках не говорим версию nginx
server_tokens off;
gzip on; # Включаем сжатие
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
gzip_vary on;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_bypass $cookie_session $http_x_update;
fastcgi_no_cache $cookie_session $http_x_update;
expires -1; # Внимание!!! Эта строка expires необходима!
add_header Last-Modified $sent_http_Expires;
fastcgi_read_timeout 180;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/vhosts.d/*.conf;
}
- Более подробно про сжатие: ngx_http_gzip_module
- worker_processes: : один рабочий процесс на одно ядро процессора (cat /proc/cpuinfo | grep processor)
- client_max_body_size и client_body_buffer_size: ограничение на размер передаваемых данных сервером nginx (ошибка 413: "Request Entity Too Large")
Настройки виртуального хоста
Файл: /etc/nginx/vhosts.d/example.com.conf:
# Переадресация с www
server {
listen 80;
server_name www.example.com;
rewrite ^ http://example.com$request_uri? permanent;
}
server {
listen 80;
server_name example.com *.example.com;
root /var/www/example.com;
access_log /var/log/nginx/example.com-access.log;
error_log /var/log/nginx/example.com-error.log;
index index.php index.html index.htm;
charset UTF-8;
# Преобразуем в красивый адрес http://example.com/sitemap.xml
location ~* /sitemap.xml {
rewrite ^ /index.php?option=com_xmap&view=xml&tmpl=component&id=1 last;
}
# Если нужно чтото запретить
location /component/jcomments/feed {
return 404;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
# Запретить запуск скриптов из директорий
location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
return 403;
error_page 403 /403_error.html;
}
# Передаём обработку PHP-скриптов PHP-FPM
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
include fastcgi_params;
# Путь к скрипту, который будет передан в php-fpm
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
}
location ~* ^.+\.(ico|jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
access_log off;
add_header Cache-Control public;
expires 7776000;
}
# Закрываем доступ к скрытым файлами (например к .htaccess и .htpassword)
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
}
Настройка php-fpm
Общий пул для всех сайтов, файл /etc/php-fpm.d/www.conf:[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = apache
group = apache
pm = dynamic
pm.max_children = 7
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
request_terminate_timeout = 60s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/www-slow.log
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
Опытным путем определим максимальное количество процессов PHP-FPM, которое можем себе позволить (параметр pm.max_children). Для этого создадим нагрузку на web-сервер и посмотрим сколько памяти будут занимать процессы PHP-FPM (утилитами top или htop).
Допустим, решено выделить серверу PHP-FPM - 200 Мб оперативной памяти, в среднем один процесс занимает 20 Мб, тогда максимальное количество будет:
pm.max_children = 200 / 23 = 8
Добавляем все в автозапуск
# chkconfig nginx on
# chkconfig php-fpm on