我在设置 nginx 来为我的临时网站提供服务时遇到了一些麻烦。我所做的就是更改 server_name,但由于某些原因,它不起作用。
url 方案为“domain.foo”表示生产,“staging.domain.foo”表示暂存,“foobar.domain.foo”表示 Web 服务,“foobar.staging.domain.foo”表示同一 Web 服务器的暂存版本,“.domain.foo”被路由去提供一些 s3 静态 HTML,“.staging.domain.foo" 被路由去为另一个存储桶中的某些 s3 静态 HTML 提供服务。所有生产 URL 均有效且配置正确,但所有暂存 URL 均无效。
这是我的配置文件。你会看到一些重复,我很乐意接受任何更正/优化,我是一名程序员,配置服务器绝对不是我的强项(但我渴望学习和提高……)。
server {
listen 80; ## listen for ipv4
server_name "domain.foo" "www.domain.foo" default_server;
access_log /var/log/nginx/access.log;
client_max_body_size 5M;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js|html)$ {
access_log off;
expires max;
root /home/foo/Foo/current/public;
break;
}
if ($host ~ 'www.domain.foo') {
rewrite ^/(.*)$ http://domain/foo/$1 permanent;
}
proxy_pass http://production;
break;
}
}
server {
listen 80;
server_name "staging.domain.foo";
access_log /var/log/nginx/access.staging.log;
error_log /var/log/nginx/error.staging.log;
client_max_body_size 5M;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://staging;
break;
}
}
server {
listen 80; ## listen for ipv4
server_name "foobar.domain.foo";
access_log /var/log/nginx/access.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if ($host = 'foobar.domain.foo') {
proxy_pass http://foobar;
break;
}
}
}
server {
listen 80; ## listen for ipv4
server_name foobar.staging.domain.foo;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://foobar_staging;
break;
}
}
server {
listen 80;
server_name "~^(.+)\.domain\.foo$";
location / {
proxy_intercept_errors on;
error_page 404 = http://domain.foo/404;
set $subdomain $1;
rewrite /$ "/$subdomain/index.html" break;
rewrite ^ /$subdomain$request_uri? break;
proxy_pass http://bucket.domain.foo.s3.amazonaws.com;
}
}
server {
listen 80;
server_name "~^(.+)\.staging\.domain\.foo$";
location / {
proxy_intercept_errors on;
set $subdomain $1;
rewrite /$ "/$subdomain/index.html" break;
rewrite ^ /$subdomain$request_uri? break;
proxy_pass http://bucket.staging.domain.foo.s3.amazonaws.com;
}
}
upstream production {
server 111.255.111.110:8000;
server 111.255.111.110:8001;
server 111.255.111.110:8002;
server 111.255.111.110:8003;
}
upstream staging {
server 222.255.222.222:8000;
server 222.255.222.222:8001;
}
upstream foobar {
server 111.255.222.165:9000;
server 111.255.222.165:9001;
server 111.255.222.165:9002;
}
upstream foobar_staging {
server 222.255.222.222:9000;
}
现在,当我将浏览器指向 staging.domain.foo 时,它挂起了。在日志中找不到任何内容,但例如创建了 access.staging.log 和 errors.staging.log。
有人有想法吗?:)
答案1
DNS 通常是此处的一个问题。请确保您的客户端和服务器都可以解析:
staging.domain.foo
如果没有为这些设置 DNS,请更新服务器和桌面上的 /etc/hosts 文件。
Nginx 使用 Host: 标头来匹配服务器名称:
将传入的 HTTP 请求的 Host 标头与 Nginx 配置文件中的服务器 { ... } 块进行比较,并选择第一个匹配的块。
http://wiki.nginx.org/HttpCoreModule#server
如果未找到匹配项,则将使用第一个监听节。