子目录中有多个应用程序的 Nginx 服务器

子目录中有多个应用程序的 Nginx 服务器

我的团队有一个用于内部工具和测试的服务器。它有一个指向它的子域:myserver.mycompany.com。我们试图实现的是拥有多个应用程序,每个应用程序都在一个子目录下。即:

  • myserver.mycompany.com- 通用入口页面
  • myserver.mycompany.com/redmine我们的内部 redmine(一个 ruby​​ on rails 服务器)
  • myserver.mycompany.com/opensocial我们目前正在测试一个 drupal 网站(php-fpm 应用程序)

我已设法让 redmine 在子目录下工作,但不能让 drupal 网站在子目录下工作。

有什么建议么?

这是我的默认虚拟主机的简化版本:

server {
    
    # server name and ssl stuff

    root /var/www/html;

    ## REDMINE
    location ~ ^/redmine(/.*|$) {
            alias /opt/redmine/public$1;
            passenger_base_uri /redmine;
            passenger_app_root /opt/redmine;
            passenger_document_root /opt/redmine/public;
            passenger_enabled on;
    }
    ## END REDMINE


    ## START Open Social
    location ~ ^/opensocial(/.*|$) {

            alias /var/www/opensocial/html$1;
            index index.php;

            location ~ ^/opensocial(/.*|$) {
                    try_files $uri /index.php?$query_string; # For Drupal >= 7
            }

            # From nginx's drupal config
            location ~ '\.php$|^/update.php' {
                    fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
                    # Ensure the php file exists. Mitigates CVE-2019-11043
                    try_files $fastcgi_script_name =404;
                    # Security note: If you're running a version of PHP older than the
                    # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
                    # See http://serverfault.com/q/627903/94922 for details.
                    include fastcgi_params;
                    # Block httpoxy attacks. See https://httpoxy.org/.
                    fastcgi_param HTTP_PROXY "";
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    fastcgi_param PATH_INFO $fastcgi_path_info;
                    fastcgi_param QUERY_STRING $query_string;
                    fastcgi_intercept_errors on;
                    # PHP 7 socket location.
                    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
            }

    }
    ## END OF Open Social

谢谢

答案1

这主要是评论(但评论框中的空间有限)

我已经设法让 redmine 在子目录下工作,但不能在 drupal 网站下工作

当您尝试访问 drupal URL 时,浏览器发生了什么?您的日志说了什么?

location ~ ^/opensocial(/.*|$) {
            alias /var/www/opensocial/html$1;

这太糟糕了。我猜你真的真的想独立管理这两个应用程序的路径。你为什么不直接使用

location /opensocial {

虽然您在 redmine 中使用了类似的模式,但您确实将其安装在了不同的位置。我不熟悉乘客的工作方式,但本来希望 Passenger_base_uri 会使正则表达式和别名变得多余。

就我个人而言,我会使用 3 个独立的服务器{} 实例并在端口 80 和 443 上放置代理 - 额外跳跃的开销可以忽略不计,并且具有扩展、安全性和管理方面的好处。

答案2

根据@symcbean 的回答,我为每个应用程序创建了一个代理服务器。

我现在的问题是 drupal 网站的内部链接和资源出现 404 错误,但我猜测这是一个应用程序问题。

这是我的新虚拟主机:

server {

        # server name and ssl stuff

        root /var/www/html;

        location /redmine {
                proxy_pass http://127.0.0.1:8000;
        }

        location /opensocial {
                proxy_pass http://127.0.0.1:8001;
        }

}

## REDMINE
server {
        listen 127.0.0.1:8000;
        root /opt/redmine/public;
        passenger_base_uri /redmine;
        passenger_app_root /opt/redmine;
        passenger_document_root /opt/redmine/public;
        passenger_enabled on;
}


## OPEN SOCIAL
server {
        listen 127.0.0.1:8001;
        root /var/www/opensocial/html;

        location / {
                try_files $uri /index.php?$query_string;
        }

        location ~ '\.php$|^/update.php' {
                fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
                # Ensure the php file exists. Mitigates CVE-2019-11043
                try_files $fastcgi_script_name =404;
                # Security note: If you're running a version of PHP older than the
                # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
                # See http://serverfault.com/q/627903/94922 for details.
                include fastcgi_params;
                # Block httpoxy attacks. See https://httpoxy.org/.
                fastcgi_param HTTP_PROXY "";
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_intercept_errors on;
                # PHP 7 socket location.
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }


}

如果我发现还有什么可以做得更好的,请评论。

相关内容