Verification: a143cc29221c9be0

Nginx настройки для php centos

1 Предварительные замечания

В этой статье будем мы будем использовать 10.4.0.10 как IP-адрес экспериментальной машины. Данные настройки в вашем случае могут отличаться, поэтому замените их на свои, где это необходимо.

2 Подключение дополнительных систем хранения

К сожалению, php-fpm не доступен в репозиториях (в официальных системах хранения) CentOS, но доступен из RemiRPM, которая сама зависит от EPEL. Можно включить обе системы хранения следующим образом (актуально для CentOS 6.5):

rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm --import https://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Запустим yum со следующими параметрами:

install -y yum-priorities

Затем отредактируем /etc/yum.repos.d/epel.repo

И добавим приоритет линии =10 к секции [epel]:

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

Затем проделаем аналогичные модификации с секцией [remi] /etc/yum.repos.d/remi.repo и изменим значение enabled на 1:

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=https://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=https://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

3 Установка MySQL 5

Во-первых, установим MySQL 5 (MariaDB), для этого запустим yum со следующими параметрами:

install -y mysql mysql-server

Затем создадим ссылки на автозагрузку для MySQL (MySQL будет загружаться автоматически при старте системы) и запустим сервер MySQL:

systemctl enable mysqld.service

Для системы под CentOS более ранних версий надо было выполнить следующее:

chkconfig --levels 235 mysqld on
service mysqld start

Теперь проверим разрешена ли работа в сети. Выполним следующее:

netstat -tap | grep mysql

Если появилось подобное сообщение:

[root]# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 1279/mysqld

Выполним следующее:

mysql_secure_installation

Для задания пароля администратора (иначе кто-угодно может получить доступ к вашим базам данных MySQL!):

mysql_secure_installation

Для дальнейшей установки вам необходимо будет ввести ваш логин и пароль, на остальные вопросы нажимаем Enter.

На этой ноте установка MySQL 5 будет завершена.

4 Установка Nginx

Nginx доступен на CentOS как из EPEL, так и с официального сайта разработчика, для установки запустим yum со следующими параметрами:

install -y nginx

Затем создадим ссылку на автозагрузку nginx и затем запустим саму программу:

systemctl enable nginx.service

Для системы под CentOS более ранних версий надо было выполнить следующее:

chkconfig --levels 235 nginx on
service nginx start

У вас может появится ошибка типа: порт 80 уже используется, ошибка будет иметь следующий вид:

[root]# service nginx start]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[FAILED]

Ошибка появляется в том случае, если уже запущена другая служба, использующая порт 80, например, apache. Остановим apache и запустим службу NGINX:

apachectl stop
yum remove httpd
chkconfig --level 235 httpd off
chkconfig --levels 235 nginx on
service nginx start

Введём IP-адрес нашего сервера или имя хоста в браузер, (например http://10.4.0.10) и перейдём на стартовую страницу nginx.

5 Установка PHP5

PHP5 может работать в nginx через PHP-FPM (FastCGI Process Manager), который является альтернативой PHP FastCGI, с дополнительными возможностями, полезными для сайтов любого размера, особенно для посещаемых сайтов. Установим php-fpm вместе с php-cli и некоторыми PHP5 модулями, например php-mysql, который потребуется для использования MySQL в ваших PHP-скриптах, для установки запустим yum со следующими параметрами:

install -y php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy

APC представляет собой бесплатный и открытый opcode кэшер для PHP, который кэширует и оптимизирует промежуточный код PHP. APC схож с другими opcode-кэшерами для PHP, такими как: eAccelerator и Xcache. Рекомендуется установить любой из этих модулей для ускорения работы динамических страниц на PHP.

Для установки APC запустим yum со следующими параметрами:

install -y php-pecl-apc

Затем откроем /etc/php.ini и установим значение cgi.fix_pathinfo=0:

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previousbehaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

Если требуется, выполняем детальную настройку PHP.

Для того, чтобы избежать ошибок часового пояса в файле /var/log/php-fpm/www-error.log, когда срабатывает скрипт PHP в браузере, нам потребуется задать часовой пояс (date.timezone)в /etc/php.ini:

[...]
[Date
] ; Defines the default timezone used by the date functions
; php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

Определить часовой пояс на нашей системе можно следующим образом:

cat /etc/sysconfig/clock
[root]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"

Затем создадим ссылки на автозагрузку для php-fpm и запустим:

chkconfig --levels 235 php-fpm on
service php-fpm start

PHP-FPM является процессом (со скриптом init/etc/init.d/php-fpm), который запускает FastCGI сервер на порте 9000.

6 Настройка nginx

Откроем файл конфигурации nginx /etc/nginx/nginx.conf:

Первым делом (рекомендуется для высоконагруженных мощных серверов) можно увеличить число запущенный процессов и установить максимальное время поддержания keepalive-соединения:

[...]
worker_processes 4;
[...]
keepalive_timeout 2;
[...];

А можно довериться разработчикам nginx и указать значения auto.

Виртуальные хосты определены на сервере в директории /etc/nginx/conf.d. Отредактируем стандартный vhost (это в /etc/nginx/conf.d/default.conf) следующим образом:

[...]
server {;
listen 80;
server_name _;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
includefastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# location ~ /\.ht {
deny all;
}
}

server_name _; создает стандартное хранилище vhost (если вы определили имя хоста).

В разделе /part, добавим index.php к строке индкекса корень /usr/share/nginx/html; означает, что корень документа находится в директории /usr/share/nginx/html.

Важной частью PHP является местоположение, строфа: ~\.php$ {}. Удалите ~ \.php$ {} для включения местоположения. Изменим корневую строку в корне документа нашего сайта (например/usr/share/nginx/html;). Также добавим строкуtry_files $uri =404, для предотвращения уязвимостей. Убедитесь, что изменили строку fastcgi_param на fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name, иначе интерпретирующая программа PHP не найдёт PHP-скрипт, который используется в браузере. В $document_root задается /usr/share/nginx/html, так как это и есть наша корневая директория.

PHP-FPM стандартно работает с портом 9000 по адресу 127.0.0.1, поэтому зададим nginx подключиться к 127.0.0.1:9000 со строкой fastcgi_pass 127.0.0.1:9000;. Также возможно использование PHP-FPM сокета - рассмотрим это в главе 7.

Теперь сохраним файл и перезапустим nginx:

service nginx reload

Создадим файл PHP в корне сайта /usr/share/nginx/html.

phpinfo();
?>

Затем откроем созданный файл в браузере (например http://10.4.0.10/info.php)

PHP5 работает через FPM/FastCGI, как показано в строке Server API. Внизу страницы представлена информация о подключенных модулях, в том числе и MySQL.

Сохраним настройки по-умолчанию

# 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

Как установить Nginx на СentOS 7

  1. 1.
  2. 2.

    Добавьте EPEL-репозиторий:

    sudo yum install epel-release
  3. 3.
  4. 4.

    Разрешите HTTP и HTTPS-трафик на брандмауэре:

    sudo firewall-cmd --permanent --add-service=http 
    sudo firewall-cmd --permanent --add-service=https
  5. 5.

    Перезагрузите брандмауэр:

    sudo firewall-cmd --reload
  6. 6.

    Запустите Nginx:

    sudo systemctl start nginx
  7. 7.

    Настройте автозапуск Nginx при перезагрузке системы:

    sudo systemctl enable nginx
  8. 8.

    Проверьте статус службы Nginx:

    sudo systemctl status nginx

    Он должен быть active:

    Nginx. Настройка CentOS 7

  9. 9.

    Перейдите в браузере по адресу http://имя_сервера_или_IP/. Если по адресу откроется стартовая страница CentOS Nginx, то установка выполнена верно:

Готово, Nginx установлен.