Fatalinn Blog

1001 блог о заработке и просто мой блог

php-fpm

Установка nginx+php-fpm на CentOS 5 - моя история

Метки: |
Дата: 30/01/2010 03:43:23
Подписаться на комментарии по RSS

Начало покорения инфы о 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 домен. Пока не нашел решения, т.к. не искал.