Настройка 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

Добавить комментарий


Защитный код
Обновить