2

我正在尝试制定以下配置;作为序言,我有一个工作 Nginx/PHP FastCGI 实现在具有单个 IP 地址的服务器上工作,没有 FQDN 和/或 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/;
    }
}

我可以使用正则表达式捕获客户端位置,但随后根据我所看到的情况,我开始对下一步做什么感到有点“模糊”。当我 CURL 到基本 ip addy 时,这是预期的,返回 Nginx 的“欢迎”页面。

现在,当我使用客户端名称(返回 200 $document_root$uri; 未注释)传递相同的 addy 时,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; 

这有什么意义吗?我想我已经很接近了,但我只是不知道是不是这样。

4

1 回答 1

0

好吧,纠正这个特定配置的底线是在我注意到“客户端”位置块中发生了什么之后更改服务器上的文件路径。这是最终的配置块代码:

## -------------------------------------------------
#   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 池文件都需要镜像“listen”参数中使用的特定端口。在下面的 $port 变量的配置“if”代码中。

感谢所有觉得有必要为输入做出贡献的人!

于 2016-05-10T19:43:17.490 回答