Блокировка местоположения и прокси-сервер FastCGI

Я пытаюсь разработать следующую конфигурацию; предваряя это, у меня есть работающая реализация Nginx/PHP FastCGI, работающая на сервере с одним IP-адресом, без полного доменного имени и/или DNS, обслуживающего один веб-сайт/приложение на основе PHP. Теперь у меня тот же сценарий с другим сервером, разница в том, что требуется обслуживать несколько клиентских сайтов (один из которых является сайтом Wordpress). Я также НЕ являюсь экспертом по Nginx на сегодняшний день.

Для обзора: корень документа для блока сервера — '/usr/share/nginx/html', значение по умолчанию для Nginx. Подается нормально, без проблем с http://xxx.xxx.xxx.76. Теперь требуется, чтобы клиенты вводили в своем браузере адрес http://xxx.xxx.xxx.76/pmhs в качестве примера. Затем будет обслуживаться их сайт на основе php и так далее для http://xxx.xxx.xxx.76/client для настройки и обслуживания любых других сайтов.

Корневой каталог документов для этих клиентов находится в стандартной папке CentOS 7 '/srv', где все клиенты настроены так, чтобы контент сайта был доступен в их папке '/srv/www/{client}.production/public_html'. Большинство примеров конфигурации, которые мне удалось откопать, на самом деле не относятся к этому типу конфигурации, большинство, если не все, имеют какой-то сервер и/или DNS, что делает маршрутизацию немного более понятной (на мой взгляд, в этом стык).

server {
    ## -------------------------------------------------
    #   define virtual server configuration
    ## -------------------------------------------------
    listen          80;
    server_name     localhost;
    root        /usr/share/nginx/html;
    index       index.html index.htm index.php;

    access_log      /var/log/nginx/default.access.log  main;
    error_log       /var/log/nginx/default.error.log debug;
    rewrite_log     on;

    ## -------------------------------------------------
    #   default site / ip address 
    #     @ serve nginx welcome page
    ## -------------------------------------------------
    location = / {
    try_files $uri $uri/;
    }

    ## -------------------------------------------------
    #   favicon.ico location filter
    ## -------------------------------------------------
    location = /favicon.ico { access_log off; log_not_found off; }

    ## -------------------------------------------------
    #   do not serve hidden files
    ## -------------------------------------------------
    location ~ /\. { access_log off; log_not_found off; deny all; }

    ## -------------------------------------------------
    #   client website location block
    ## -------------------------------------------------
    location ~ ^\/(?<client>[\w-_]+) {
        # reset the document root for the client
        #root /srv/www/$client.production/public_html;
        alias /srv/www/$client.production/public_html;

        # set the port used for the clients fastcgi pool
        if ($client = "belmond") { set $port 9000; }
        if ($client = "freeboard") { set $port 9001; }
        if ($client = "pmhs") { set $port 9002; }
        if ($client = "vesta") { set $port 9003; }

        #return 200 $document_root$uri;

        # nginx pass to php fastcgi - serve client web
        #location ~ [^/]\.php(/|$) {
        #}
    }

    location @fastcgi_proxy {
        fastcgi_split_path_info ^(.+?\.php)(.*)$;
        set $orig_path $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        fastcgi_pass                        127.0.0.1:9000;
        fastcgi_index                       index.php;

        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME       $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO             $orig_path;
        fastcgi_param PATH_TRANSLATED       $document_root$orig_path;
        set $temp                           "/var/lib/php/fpm/session";
        fastcgi_param TEMP                  $temp;

        fastcgi_read_timeout                500;
        fastcgi_ignore_client_abort         on;
        fastcgi_connect_timeout             60;
        fastcgi_send_timeout                180;
        fastcgi_buffer_size                 8k;
        fastcgi_buffers     64              8k;
        fastcgi_temp_file_write_size        256k;
    }

    ## -------------------------------------------------
    #   redirect server error pages 
    #     @ serve nginx static page(s) /50x.html
    ## -------------------------------------------------
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
    try_files $uri $uri/;
    }
}

Я могу зафиксировать местоположение клиента с помощью регулярного выражения, но затем оно начинает становиться немного «размытым» для меня относительно того, что делать дальше, исходя из того, что я вижу. Когда я перехожу к базовому IP-адресу, это то, что ожидается, возвращается страница приветствия Nginx.

Теперь, когда я передаю тот же адди с именем клиента (с возвратом 200 $document_root$uri; без комментариев), псевдоним document_url был правильно указан, но теперь я немного растерялся. В конечном счете, я хотел бы, чтобы все клиентские сайты были настроены на прокси-сервер php-fpm fastcgi для обслуживания (именно поэтому код $port определен, но еще не используется).

Просто ищу любое направление и т. Д. О том, как это очистить и заставить его работать правильно, в то же время продолжая изучать конфигурацию Nginx в процессе ...

Какова будет цель для основного IP-адреса (в настоящее время работает в соответствии с этой конфигурацией):

URL = xxx.xxx.xxx.76 or xxx.xxx.xxx.76/ 
[serve] /usr/share/nginx/html/(*.html) content
[from] root /usr/share/nginx/html; 

(Необходимо определить, как обслуживать клиентские сайты из каталога их серверов)

URL = xxx.xxx.xxx.76/pmhs or xxx.xxx.xxx.76/pmhs/ 
[serve] /srv/www/pmhs.production/public_html/(*.php) 
[from] root srv/www/pmhs.production/public_html; 

URL = xxx.xxx.xxx.76/acme or xxx.xxx.xxx.76/acme/ 
[serve] /srv/www/acme.production/public_html/(*.php) 
[from ] root srv/www/acme.production/public_html; 

Есть ли в этом смысл? Я думаю, что я довольно близко, но я просто не знаю, так это или нет.


person Doktor13    schedule 09.05.2016    source источник
comment
Судя по тому, что вы написали и что вы сделали - все выглядит правильно. У вас правильная настройка, общая идея полностью прекрасна (прокси к другому порту fpm в зависимости от того, что вы вытащили из path), и все, что вам осталось, это получить синтаксис конфигурации nginx, чтобы передать переменную порта смотря что в адресной строке. Выглядит хорошо для меня.   -  person Mjh    schedule 09.05.2016
comment
От cli $› curl xxx.xxx.xxx.76/pmhs я получаю ответ 301 с сервера получить строку, записанную в журнал доступа, но не в журнал ошибок. И наоборот, с URL-адреса браузера xxx.xxx.xxx.76/pmhs я получаю 403 [ Запрещено] ответ от сервера, получить строку, записанную как в журналы доступа, так и в журналы ошибок. Вот строка ошибки: *4 индекс каталога /srv/www/pmhs.production/public_html запрещен, клиент: xx.xx.xx.xxx, сервер: localhost, запрос: GET /pmhs/ HTTP/1.1, хост: xxx .xxx.xxx.76 Существует файл index.php для отображения стандартной страницы phpinfo. Идеи?   -  person Doktor13    schedule 09.05.2016
comment
directory index of "/srv/www/pmhs.production/public_html" is forbidden вы проверили права доступа к каталогу? похоже, что Nginx не может получить доступ к этому каталогу.   -  person MMT    schedule 10.05.2016
comment
Это странно, чувак... Я переместил код fastcgi в блок местоположения клиента, поставил косую черту в конце определения «псевдоним» и получил «/srv/www/pmhs.production/public_html//pmhs/index.php ' from 'return 200 $document_root$fastcgi_script_name' во внутреннем блоке местоположения php. Удалите косую черту в конце определения «псевдоним», и я получу «индекс каталога /srv/www/pmhs.production/public_html запрещен» в журнале ошибок и рендеринг веб-страницы 403. Я действительно ломаю голову над этим... Но спасибо за ответ...   -  person Doktor13    schedule 10.05.2016


Ответы (1)


Что ж, суть исправления этой конкретной конфигурации заключалась в том, чтобы изменить пути к файлам на сервере после того, как я заметил, что происходит в блоке местоположения «клиент». Вот окончательный код блока конфигурации:

## -------------------------------------------------
#   client website location block
## -------------------------------------------------
location ~ ^\/(?<client>[\w-_]+) {
    # reset the document root for client sites
    root /srv/www;

    # nginx pass to php fastcgi - serve client web
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(.*)$;
        set $original_path $fastcgi_path_info;

        # set the port used for the clients fastcgi pool
        if ($client = "phms") { set $port 9000; }
        if ($client = "vesta") { set $port 9001; }

        try_files $fastcgi_script_name =404;

        fastcgi_pass                        127.0.0.1:$port;
        fastcgi_index                       index.php;

        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME       $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO             $original_path;
        fastcgi_param PATH_TRANSLATED       $document_root$original_path;
        set $temp                           "/var/lib/php/fpm/session";
        fastcgi_param TEMP                  $temp;

        fastcgi_read_timeout                500;
        fastcgi_ignore_client_abort         on;
        fastcgi_connect_timeout             60;
        fastcgi_send_timeout                180;
        fastcgi_buffer_size                 8k;
        fastcgi_buffers     64              8k;
        fastcgi_temp_file_write_size        256k;
    }
}

Это действительно сводилось к тому, чтобы для краткости внести изменения в пути к корневому файлу документа на основе значений отладки, которые я заметил. Я мог бы получить исходные пути для работы, но это потребовало бы реальных усилий, и у нас не было выделенного времени, и я не хотел в этот момент «бороться с мэрией» с nginx, чтобы заставить вещи работать с определение внутренней клиентской файловой системы.

Итог, это работает... одно важное замечание для любых разработчиков php-fpm, которые смотрят на это, должно быть несколько очевидно, что файл пула php-fpm для каждого клиента требует, чтобы конкретный порт, используемый в параметре «прослушивать», был зеркальным. в коде конфигурации 'if' для переменной $port ниже.

Спасибо всем, кто почувствовал необходимость внести свой вклад!

person Doktor13    schedule 10.05.2016