LINUX.ORG.RU
ФорумAdmin

Не получается подружить nginx и php

 ,


1

2

Собственно сабж
Нашёл множество инструкций по поднятию стека LEMP, например эту http://rus-linux.net/MyLDP/server/Howto-install-LEMP.html делаю всё как написано. Дистрибутив - CentOS 7.
Пытаюсь открыть страницу, браузер мне вместо этого предлагает сохранить php-файл.
И ещё смежный вопрос: что нужно сделать в пакетном менеджере, чтобы установка php не тащила httpd?

★★★★★

чтобы установка php не тащила httpd?

Не ставить пакет php.

Deleted
()

так там для c7 не предлагают php ставить, только php-fpm. ошибся, пора спать.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от sunny1983

Вот так весело собирают пакеты в центоси. Когда у меня krfb и krdc оказались в одном пакете и ставились только вместе - я тоже был удивлён.

dhameoelin ★★★★★
()

Ставь «nginx php5». Есть подозрение, что по зависимостям вылезают какие-то апачевские либы и модули.

Radjah ★★★★★
()
Ответ на: комментарий от Deleted

Я ещё раз говорю, что всё сделал по инструкции. Установил php-fpm - не заработало, на всякий случай установил php - всё равно не заработало.
Не очень понимаю механику. С apache php соединяется при помощи модуля, для nginx такого модуля нет, но нужно запустить php-fpm «systemctl start php-fpm.service». Всё остальное тоже выполнил. Где искать ошибку?

sunny1983 ★★★★★
() автор топика

Ну, если даже инструкция с самого РУСЛИНУКСНЕТ не работает, то совершенно очевидно, что способов запустить лемп-стек на центоси не существует.

thesis ★★★★★
()

Ставишь nginx + php + php-fpm, в nginx.conf:

location ~ \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME $fastcgi_script_name;
    }

Стартуешь демон php-fpm и проверяешь результат :)

flappyright
()
Ответ на: комментарий от flappyright

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

Тогда еще в конфиге пула php-fpm надо на этот сокет поменять, по дефолту там 9000 порт.

Deleted
()
Ответ на: комментарий от int13h

а если телнетом на порт php-fpm стукануть, то что потдается?

$ telnet 127.0.0.1 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Где искать ошибку?

В подходе. Для начала разберись в общих чертах как эта связка должна работать, а потом уже настраивай её. Тебе ведь её потом эксплуатировать.
Не надо пытаться слепо повторить инструкцию.

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

В общих чертах понимаю, что к nginx php привязывается через fastcgi-интерфейс php-fpm, а к apache с помощью модуля mod_php.

В /etc/php-fpm.conf есть строки:

listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1

В /etc/nginx/nginx.conf есть:

location ~ \.php$ {
            fastcgi_index  index.php;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

В /var/log/nginx/access.log - сообщения об успешных отгрузках страниц.
В /var/log/nginx/error.log и /var/log/nginx/php-fpm/error.log - ничего криминального.

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от sunny1983

У меня до php-fpm клиентские запросы кажется на доходят?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

nginx обращается к демону php-fpm по протоколу FastCGI через unix или обычный сетевой сокет. Домен php-fpm запускает воркеры которые исполняют php-скрипты.

А вот это вот что такое:

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;



И почему директория логов php-fpm находится внутри директории логов nginx?

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Опечатка
/var/log/php-fpm/error.log
Это было в /etc/nginx/nginx.conf.default Я это перенёс в /etc/nginx/nginx.conf и раскоментировал.
Вообще-то ошибка возникает на виртуальном хосте описанном в файле /etc/nginx/conf.d/mycoolhost.ru.conf такого содержания:

server {
   listen *:80;
   server_name mycoolhost.ru;
   root "/var/lib/nginx/mycoolhost.ru";
}
Хотел в этот же блок добавить location ~ \.php$ но nginx ругаясь в логах на неправильный конфиг. Тогда я добавил location ~ \.php$ в default_server

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от MrClon

Ладно, буду дальше курить доки по nginx. Я думал, что «_» (default_server) это глобальные настройки всех виртуальных хостов.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от MrClon

Так неинтересно. Должен быть аукцион дух состязания.

Twissel ★★★★★
()

А вообще: не получится настроить php-fpm, повесь на бекенд Апач.

Twissel ★★★★★
()
Ответ на: комментарий от sunny1983

Что вкурил: мне нужен модуль ngx_http_fastcgi_module, он настраивается путём добавления блока location, содержащего соответствующие директивы https://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html
Если блок location добавлен в блок сервера (виртуального хоста) по умолчанию - то его действия распостраняются и на все остальные серверы.
Так у меня точно так и есть.
Проще показать.

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    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;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
        location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
        location ~ \.php$ {
            fastcgi_index  index.php;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 2)
Ответ на: комментарий от sunny1983

Ладно, ладно) Ты если чё пиши, не стесняйся, мы тут.

Twissel ★★★★★
()
Ответ на: комментарий от sunny1983

Ну ок, читай документацию дальше. Пока-что ты прочёл явно недостаточно. Или понял недостаточно.

MrClon ★★★★★
()
Ответ на: комментарий от sunny1983

Держи конфиг, не мучайся

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
          index index.php index.html index.htm;
        }
        location ~ \.php$ {
            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}
Twissel ★★★★★
()
Ответ на: комментарий от Twissel

Можно указать server_name yourdomain.ru для твоего домена.

Для каждого домена я делал свой конфиг.

Twissel ★★★★★
()

Centos 7 стоит php7 + php-fpm + nginx + owncloud + mariadb и т.п., без httpd
Подключаешь:

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Ставишь, если не жалко
# yum install php70w php70w-cli php70w-common php70w-devel php70w-gd php70w-ldap php70w-mbstring php70w-mysql php70w-opcache php70w-pdo php70w-pear php70w-pecl-apcu php70w-process php70w-xml php70w-fpm php70w-pecl-apcu-devel php70w-pecl-imagick php70w-pecl-imagick-devel
Если стоял php из стандартных реп то:
# yum install yum-plugin-replace
# yum replace php-common --replace-with=php70w-common
Остальное примерно так в конфигах
# cat /etc/php-fpm.d/www.conf
; Start a new pool named 'www'.
[www]
user = apache
group = apache
listen = /var/run/php-fpm/php-fpm.sock
;listen = 127.0.0.1:9000
listen.owner = apache
listen.group = apache
listen.mode = 0660
listen.allowed_clients = 127.0.0.1

pm = dynamic

pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on

php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Закомментируй стандартные настройки (все секции server) в

# cat /etc/nginx/nginx.conf
Создай новый конфиг для дефолтного сайта:
# cat /etc/nginx/conf.d/test.conf 
server {
    listen 80;
    server_name example.com;
root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Добавить в

# cat /usr/share/nginx/html/info.php 
<?php phpinfo(); ?>

!!!!!Почистить кеш в браузере!!!!

Перезапустить php-fpm/nginx

Зайти на example.com/info.php

Конфиг owncloud, может кстати кому то еще пригодиться:

# cat /etc/nginx/conf.d/owncloud.conf

upstream php-handler {
 #server 127.0.0.1:9000;
 server unix:/var/run/php-fpm/php-fpm.sock;
 }

server {
 listen 80;
 server_name example.com;
 # enforce https
 return 301 https://$server_name$request_uri;
 }

server {
 listen 443 ssl;
 server_name example.com;

 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# Add headers to serve security related headers
 add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
 add_header X-Content-Type-Options nosniff;
 add_header X-Frame-Options "SAMEORIGIN";
 add_header X-XSS-Protection "1; mode=block";
 add_header X-Robots-Tag none;
 add_header X-Download-Options noopen;
 add_header X-Permitted-Cross-Domain-Policies none;

 # Path to the root of your installation
 root /var/www/html/owncloud/;
 # set max upload size
 client_max_body_size 10G;
 fastcgi_buffers 64 4K;

 # Disable gzip to avoid the removal of the ETag header
 gzip off;

 # Uncomment if your server is build with the ngx_pagespeed module
 # This module is currently not supported.
 #pagespeed off;

 index index.php;
 error_page 403 /core/templates/403.php;
 error_page 404 /core/templates/404.php;

 rewrite ^/.well-known/carddav /remote.php/carddav/ permanent;
 rewrite ^/.well-known/caldav /remote.php/caldav/ permanent;

 # The following 2 rules are only needed for the user_webfinger app.
 # Uncomment it if you're planning to use this app.
 #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
 #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }

location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
   deny all;
}

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
  deny all;
}

location / {
  rewrite ^/remote/(.*) /remote.php last;
  rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
#  try_files $uri $uri/ =404;
  try_files $uri $uri/ /index.php?q=$uri&$args;
}

 location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
    fastcgi_pass php-handler;
    fastcgi_intercept_errors on;
 }

 # Adding the cache control header for js and css files
 # Make sure it is BELOW the location ~ \.php(?:$|/) { block
 location ~* \.(?:css|js)$ {
 add_header Cache-Control "public, max-age=7200";
 # Add headers to serve security related headers
 add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
 add_header X-Content-Type-Options nosniff;
 add_header X-Frame-Options "SAMEORIGIN";
 add_header X-XSS-Protection "1; mode=block";
 add_header X-Robots-Tag none;
 add_header X-Download-Options noopen;
 add_header X-Permitted-Cross-Domain-Policies none; 
# Optional: Don't log access to assets
    access_log off;
 }

 # Optional: Don't log access to other assets
 location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
   access_log off;
 }
}

HarDX ★★
()
Ответ на: комментарий от HarDX

Так,
Если другие версии (сборки) ngninx и php-fpm данная инструкция сработает?
У меня установлены nginx 1.10.2 из epel, php и php-fpm 5.4.16 из base.

То что у тебя в nginx.conf в директиве listen не стоит default_server это нормально?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Нормально, зависит от конфигурации.

Да должно сработать конечно. Про кеш в браузере не забывайте очистить.

HarDX ★★
()
Ответ на: комментарий от sunny1983

В сообщении выше

cat /etc/php-fpm.d/www.conf
Приведено, то что менялось, остальное по дефолту.

HarDX ★★
()
Последнее исправление: HarDX (всего исправлений: 2)
Ответ на: комментарий от HarDX

Сменил в конфигах tcp-сокет на файл сокета unix:/var/run/php-fpm/php-fpm.sock, почистил кэш - по прежнему нифига.

Потом решил ещё одну проверку сделать, обратился к серверу не по имени хоста, а по ip-адресу, в этом случае обращение должно идти к default_server, который отображает заглушку. Положил в корневые директории как default_server, так и хоста mycoolhost.ru файл ttt.php с содержанием:

<?php
   phpinfo();
?>
Вобщем - запрашиваю ttt.php через ip-адрес - всё работает, запрашиваю через mycoolhost.ru - браузер вместо отображения предлагает сохранить php-файл на диск.

Для тех кто не читал переписку, любые попытки добавить директивы fastcgi_* куда-либо кроме default_server приводят к тому, что nginx отказывается запускаться.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Проще наверное действительно показать. Вобщем теперь nginx запускается без ошибки, в прошлый раз наверное точку с запятой пропустил, но на default_server php работает, на mycoolhost.ru - не работает, в этот раз выдаёт ошибку 404
/etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    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;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        index   index.php index.html index.htm;
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location ~ \.php$ {
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
/etc/nginx/conf.d/mycoolhost.ru.conf
server {
   listen 80;
   server_name mycoolhost.ru;
   root /var/lib/nginx/mycoolhost.ru;
   index index.html index.htm index.php;
   location ~ \.php$ {
      fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 2)
Ответ на: комментарий от sunny1983

Добавь в mycoolhost.ru еще один локейшн, вот так


location / {
           index index.php index.html index.htm;
        }

Добавлено

И я бы поменял

index index.php index.html index.htm;

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Локейшен добавил. И вообще с этим сервером всячески извращался. По прежнему в default_server php работает, а в mycoolhost.ru нет.

И в процессе возник один вопрос: Допустим на nginx настроено несколько виртуальных серверов и на все три одновременно приходят запросы на получение php-страницы, стало быть все три запроса обрабатываются модулем ngx_http_fastcgi_module и отправляются в php-fpm. Как php-fpm поймёт куда результат каждой обработки отправлять? Или мне надо было для каждого виртуального сервера свой сокет для обмена с php-fpm создать?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Как php-fpm поймёт куда результат каждой обработки отправлять?

pid конкретного процесса php-fpm, вестимо.

Если ошибаюсь, пусть поправят.

MrClon

Или мне надо было для каждого виртуального сервера свой сокет для обмена с php-fpm создать?

Не нужно, у меня два домена на одном хосте VPS, сокет один.

Кстати, покажи конфиги php-fpm. Кажется я начинаю догадываться в чем у тебя дело.

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Кстати, покажи конфиги php-fpm. Кажется я начинаю догадываться в чем у тебя дело.

/etc/php-fpm.conf

include=/etc/php-fpm.d/*.conf
[global]
pid = /run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = no
/etc/php-fpm.d/www.conf
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.allowed_clients = 127.0.0.1
user = apache
group = apache
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983
user = apache
group = apache

А что это за улица,что за дом пользователь и группа, какие у него права?

nginx от его имени запускается?

Покажи ls -l /var/run/php-fpm/php-fpm.sock

Twissel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.