我正在运行一个 Redmine 实例,它使用 nginx 进行 SSL 连接并使用 apache 提供内容服务。
我正在通过在新机器上安装最新版本来升级它,一旦一切正常,我将复制文件和数据库。
我已经将 apache 和 nginx 的配置从现有机器复制到新机器,但两台机器上的结果不同,我不知道原因。
在当前生产实例中,Redmine 在端口 18804 上运行(这是我老板的规定)。目前,当有人使用浏览器访问 redmine.mydomain.com 时,他们会使用 HTTPS 自动重定向到 Redmine。无论末尾是否附加 :18804,都会发生这种情况,这正是我希望它如何运行。
但是在新机器上,如果我在浏览器中输入 newredmine.mydomain.com,我会被重定向到 nginx 测试页面。但是,如果我输入 newredmine.mydomain.com:18804,或者https://newredmine.mydomain.com,然后我将使用 HTTP 路由到该应用程序。
我需要通过输入逻辑 URL 来实现这一点。显然,重定向到 HTTPS 不起作用,但由于配置是精确的副本,我不明白为什么。
当前服务器运行的是 Amazon Linux、Apache 2.2.31 和 nginx 1.10.2。新服务器运行的是 Centos 7、Apache 2.4.6 和 nginx 1.10.2。
这是我的应用程序的 nginx 配置:
upstream redmine {
server 127.0.0.1:18805;
}
server {
listen 18804;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name application.mydomain.com;
access_log /var/log/nginx/redmine.access.log;
error_log /var/log/nginx/redmine-errors.log;
ssl on;
ssl_certificate_key /etc/ssl/private/key;
ssl_certificate /etc/ssl/certs/crt;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 0;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://redmine;
}
}
如果需要的话,我的服务器将从 Apache 中阻止:
# Redmine 3.3.3
<VirtualHost *:18805>
DocumentRoot /var/www/html/redmine/public
ServerName newredmine.mydomain.com
ServerAlias 127.0.0.1
ErrorDocument 503 /maintenance.html
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/../tmp/stop.txt -f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /$1 [R=503,L]
<Directory /var/www/html/redmine/public/>
AllowOverride all
# MultiViews must be turned off.
Options -MultiViews
</Directory>
ErrorLog logs/redmine_3.3.3_log
正如我所说,真正令人困惑的是,尽管两个实例的配置相同,但其行为却不同。唯一的区别是您可以预料到的,例如 Redmine 公共文件夹的位置。
有人能看到我这里遗漏了什么吗?
答案1
您缺少server_name
重定向服务器块。因此,nginx 上的实际虚拟主机选择并不那么清晰。
首先,您需要确保有一个块在指令上server
具有属性。在此块中,您可以定义服务器在收到未明确配置的主机请求时执行的操作。default_server
listen
然后,您需要有server
类似这样的块来进行重定向:
server {
listen 18804;
server_name redmine.mydomain.com;
return 301 https://redmine.mydomain.com$uri;
}
server {
listen 80;
server_name redmine.mydomain.com;
return 301 https://redmine.mydomain.com$uri;
}
最好在return
指令中使用明确的域名,因为$host
变量在某些时候可能包含非所需的值。
SSL 块可以保持现在的样子。