Подготовка. В качестве операционной системы для большинства серверов использутся 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
|