php-fpm
Установка nginx+php-fpm на CentOS 5 - моя история
Начало покорения инфы о nginx+php-fpm
Началось с того, что мне захотелось поставить nginx на мой VPS и чтобы при этом Apache ни как не участвовал в работе. Я начал искать инфу и нагуглил пару интересных статей, нашел самый дешевый VPS и стал, что то мутить на нем.Первые попытки были в правильном русле, но что то ни как не хотели работать php скрипты. Я искал новую инфу по связке nginx+php-fpm нашел пару нормальных статей. Их труд я попытался переложить на свои нужды и в один момент у меня заработало исполнение скриптов, но есть всегда досадное но - при явном указании главной страницы (index.php) мне предлагали скачать ее.
И вот я снова что то мудрил и ковырял в этих конфигах. В конечном итоге у меня заработало все это дело, но не полностью так как хотел
Лирическая вставка
Использовался VPS с CentOS 5.3 x86-x64 и почемуто на нем не полностью работали все x86 дистрибутивы линуксов.На них не работала команда top, а остальное вроде работало.Так же я хотел имень удобное управление своим VPS и поэтому поставил панель ISPManager lite. Панель заставить работать с nginx у меня не получилось и информации по этому вопросу я тоже не нашел, пришлось оставить Апач для панельки. Это один косяк в моей работе.
- Все забываю сказать, в администрировании серверком у меня знаний нет, в линуксах я ничего не понимаю, php и html не знаю, все делается только головой и прямыми руками.
Второй косяк после проделанной работы - nginx и php-fpm у меня не взаимодействуют через юникс сокеты, почему то php-fpm не создает файл сокета там где нужно, и пришлось работать через ип:порт.
Конфиги
Я смог запустить работу данной связки на следующих конфигах:Начнем с самого простого конфига php-fpm, находится он в /etc/php-fpm.conf
<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">127.0.0.1:9000</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">5</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>
<value name="listen_address">127.0.0.1:9000</value> Тут устанавливается ИП и порт куда будут слать данные для php.
<value name="MinSpareServers">5</value> Количество запущенных процессов, в данном случае 5. Каждый процесс занимает 5-7 метров оперативы, у меня.
Далее следует конфиги nginx'а, находится в /etc/nginx/nginx.conf и /etc/nginx/conf.d/ваши_конфиги.conf
Его конфиг я разбил на 2 части для лучшего использования.
user nginx;
worker_processes 1;
worker_rlimit_nofile 100000;
#error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
limit_zone one $binary_remote_addr 10m;
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 logs/access.log main;
sendfile on;
client_max_body_size 16m;
server_tokens off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
send_timeout 900;
gzip on;
include conf.d/*.conf;
}
Лично для себя я отключил все логи, мне они точно не нужны.
worker_processes 1; Количество запущенных процессов, некоторые советуют выбирать по количеству хардов в системе а некоторые по количеству ядер на проце. И того и другого у меня 1.
Далее следует образец виртуального хоста. (+ подсмотрена идея на хабаре)
server {
listen 80;
#server_name $host;
charset UTF-8;
reset_timedout_connection on;
#access_log logs/sample.access.log main;
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /www/$host;
error_page 404 = @fallback;
}
location / {
root /www/$host;
index index.php;
autoindex off;
autoindex_exact_size on;
autoindex_localtime on;
limit_conn one 3;
set $limit_rate 16M;
}
location ~ \.php$ {
fastcgi_pass_request_body on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$host$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
fastcgi_param DOCUMENT_ROOT /www/$host;
}
}
Слово $host означает что надо в файле /etc/hosts прописывать ваши домены (там есть пример) и создать папку в /www с одноименным названием и ваш сервер nginx пустит посетителей на ваш домен, а если его там нет то выдаст ошибку. По моему намного проще и лучше иметь такой универсальный конфиг, чем 100 однообразных на разные домены.
Ну вот дошли мы и до третьего косяка - домен откликается только на что что напишите вы в тех местах, а следовательно надо делать перенаправление с www на без www домен. Пока не нашел решения, т.к. не искал.