我的团队有一个用于内部工具和测试的服务器。它有一个指向它的子域: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;
}
}
如果我发现还有什么可以做得更好的,请评论。