Система поддержки ЦОД

Часто задаваемые вопросы: Общий FAQ
Как установить nginx + php-fpm + mysql на centOS?
Автор Алексей Ефименко, Last modified by Алексей Ефименко на 15 декабря 2021 17:07
Подготовка.
В качестве операционной системы для большинства серверов использутся CentOS 5. С одной стороны, эта система имеет длительный срок поддержки, а с другой – достаточно консервативна, так что шансы получить проблемы при обновлениях невелики.

Несколько слов об используемом ПО. nginx – это быстрый и крайне нетребовательный к ресурсам HTTP (и не только) сервер, который используется для раздачи статики (картинки, стили, javascript), а также позволяет работать с динамическим контентом используя FastCGI API. PHP-FPM – это улучшенная реализация интерфейса FastCGI для PHP, распространяемая в виде патча к исходникам PHP. Сервер FastCGI позволяет работать по TCP или используя локальный socket. APC – “оптимизатор” PHP, реализующий опкод кеширование для скриптов и, помимо этого, предоставляющий интерфейс для хранения данных скрипта в shared памяти. Его применение имеет смысл только в FastCGI или Apache SAPI режимах.

Репозиторий centos не содержит php-fpm. Конечно, можно самостоятельно скомпилировать PHP 5.2.11 + php-fpm, но намного более “правильный” с точки зрения удобства обновления и поддержки способ – использование репозитория. Для использования php5.2.x + fpm на наших серверах мы создали репозиторий (rpms.varien.com). В настоящий момент поддерживается CentOS/RHEL 5, архитектуры i386 и x86_64. Также нам потребуется подключить репозиторий EPEL, содержащий многие программы и библиотеки, отсутствующие в системных репозиториях CentOS/RHEL.

Подключение репозиториев:

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
# wget http://rpms.varien.com/varien-release-1-1.centos.varien.noarch.rpm
# rpm -Uvh varien-release-1-1.centos.varien.noarch.rpm


Устанавливаем нужное нам ПО:

# yum install nginx
# yum install php-fpm php-mysql php-gd php-mcrypt php-dom
# yum install php-pecl-apc
# yum install mysql-server


Включаем автостарт необходимых сервисов:

# /sbin/chkconfig nginx on
# /sbin/chkconfig mysqld on
# /sbin/chkconfig php-fpm on



Конфигурируем nginx (файл /etc/nginx.conf). В данном примере скрипт расположен по пути /dle/ в папке /var/www/html/dle. Поддерживается URL Rewrite (аналог конфигурации для apache mod_rewrite), для php используется PHP-FPM подключенный через unix socket.

user              nginx;
worker_processes  
1;
error_log        
/var/log/nginx/error.log;
pid              
/var/run/nginx.pid;

events
{
    worker_connections  
1024;
}

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;
    sendfile        on
;
    keepalive_timeout  
65;

   
# fastcgi nodes
    upstream  backend  
{
        server unix
:/tmp/fcgi.sock;
   
}

    server
{
        listen      
80;
        server_name  example
.local;
        root  
/var/www/html;
        autoindex off
;

        gzip on
; # use gzip compression
        gzip_proxied any
; # enable proxy for the fcgi requests
        gzip_types text
/plain text/html text/css text/javascript;

       
# protection (we have no .htaccess)
        location
~ (^/dle/(app/|includes/|lib/|/pkginfo/|var/|report/config.php)|/\.svn/|/.hta.+) {
            deny all
;
       
}

       
# handle all .php files, /downloader and /report
        location
~ (\.php|/downloader/?|/report/?)$ {
           
if ($request_uri ~ /(downloader|report)$){ # no trailing /, redirecting
                rewrite  
^(.*)$ $1/ permanent;
           
}
            fastcgi_index index
.php;
            include
/etc/nginx/fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name
;
           
if (-e $request_filename) { # check if requested path exists
                fastcgi_pass backend
;
           
}

       
}

       
# handle dle
        location
/dle/
       
{
           
# set expire headers
           
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") {
                expires max
;
           
}
           
# set fastcgi settings, not allowed in the "if" block
            include
/etc/nginx/fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root
/dle/index.php;
            fastcgi_param SCRIPT_NAME
/dle/index.php;
           
# rewrite - if file not found, pass it to the backend
           
if (!-f $request_filename) {
                fastcgi_pass backend
;
               
break;
           
}
       
}
   
}
}



Конфигурация PHP-FPM (файл /etc/php-fpm.conf).
Используется локальный socket. Наиболее важный параметр тут – max_children, его значение должно быть подобрано с учетом конфигурации (память, CPU) в процессе тестов нагрузки.

<configuration>
       
<section name="global_options">
               
<value name="pid_file">/var/run/php-fpm.pid</value>
               
<value name="error_log">/var/log/php-fpm.log</value>
               
<value name="log_level">notice</value>
               
<value name="emergency_restart_threshold">10</value>
               
<value name="emergency_restart_interval">1m</value>
               
<value name="process_control_timeout">5s</value>
               
<value name="daemonize">yes</value>
       
</section>
       
<workers>
               
<section name="pool">
                       
<value name="name">default</value>
                       
<value name="listen_address">/tmp/fcgi.sock</value>
                       
<value name="listen_options">
                               
<value name="owner"></value>
                               
<value name="group"></value>
                               
<value name="mode">0666</value>
                       
</value>
                       
<value name="php_defines">
                       
</value>
                       
<value name="user">nginx</value>
                       
<value name="group">nginx</value>
                       
<value name="pm">
                               
<value name="style">static</value>
                               
<value name="max_children">10</value>
                               
<value name="apache_like">
                                       
<value name="StartServers">20</value>
                                       
<value name="MinSpareServers">5</value>
                                       
<value name="MaxSpareServers">35</value>
                               
</value>
                       
</value>
                       
<value name="request_terminate_timeout">0s</value>
                       
<value name="request_slowlog_timeout">0s</value>
                       
<value name="slowlog">logs/slow.log</value>
                       
<value name="rlimit_files">1024</value>
                       
<value name="rlimit_core">0</value>
                       
<value name="chroot"></value>
                       
<value name="chdir"></value>
                       
<value name="catch_workers_output">yes</value>
                       
<value name="max_requests">500</value>
                       
<value name="allowed_clients">127.0.0.1</value>
                       
<value name="environment">
                               
<value name="HOSTNAME">$HOSTNAME</value>
                               
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
                               
<value name="TMP">/tmp</value>
                               
<value name="TMPDIR">/tmp</value>
                               
<value name="TEMP">/tmp</value>
                               
<value name="OSTYPE">$OSTYPE</value>
                               
<value name="MACHTYPE">$MACHTYPE</value>
                               
<value name="MALLOC_CHECK_">2</value>
                       
</value>
               
</section>
       
</workers>
</configuration>



Запускаем nginx и php-fpm:

# /etc/init.d/php-fpm start
# /etc/init.d/nginx start



Запускаем mysqld, и назначаем пароль для mysql root
# /etc/init.d/mysqld start
# /usr/bin/mysql_secure_installation