我已经使用Ruby/Sinatra应用程序启动并运行了nginx,一切正常。然而,我现在正在尝试让第二个应用程序从同一台服务器上运行,我注意到了一些奇怪的事情。首先,这是我的nginx.conf:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
请注意,server_name
如何设置为FAKE.COM
,但服务器仍在响应通过其他域名访问该服务器的所有主机。如何才能使该特定服务器仅响应FAKE.COM
请求
发布于 2012-03-23 00:37:38
对于命中没有特定服务器块的服务器的所有请求,nginx配置中的第一个服务器块是默认的。
因此,在您的配置中,假设您的实际域是REAL.COM,当用户输入时,它将解析到您的服务器,并且由于此设置没有服务器块,因此FAKE.COM的服务器块将处理该请求,它是第一个服务器块(在您的情况下是唯一的服务器块)。
这就是为什么正确的Nginx配置会有一个特定的服务器块作为默认值,然后再跟随其他特定域的块。
# Default server
server {
return 404;
}
server {
server_name domain_1;
[...]
}
server {
server_name domain_2;
[...]
}
等
**编辑**
看起来有些用户被这个例子搞糊涂了,认为它只限于一个conf文件,等等。
请注意,上面是一个简单的示例,供OP根据需要进行开发。
我个人使用单独的vhost conf文件作为so (CentOS/RHEL):
http {
[...]
# Default server
server {
return 404;
}
# Other servers
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/
将包含domain_1.conf、domain_2.conf...domain_n.conf,它将包含在主nginx.conf文件中的服务器块之后,它将始终是第一个,并且始终是默认值,除非在其他地方使用default_server指令覆盖它。
在这种情况下,其他服务器的conf文件的文件名的字母顺序变得无关紧要。
此外,这种安排提供了很大的灵活性,因为可以定义多个默认值。
在我的特定情况下,我让Apache仅在内部接口上监听端口8080,并将PHP和Perl脚本代理给Apache。
但是,我运行了两个独立的应用程序,这两个应用程序都在附加的输出html中返回带有":8080“的链接,因为它们检测到Apache没有在标准端口80上运行,并试图”帮助“我。
这会导致链接无效,因为无法从外部接口访问Apache,并且链接应指向端口80。
我通过为端口8080创建一个默认服务器来重定向此类请求来解决此问题。
http {
[...]
# Default server block for undefined domains
server {
listen 80;
return 404;
}
# Default server block to redirect Port 8080 for all domains
server {
listen my.external.ip.addr:8080;
return 301 http://$host$request_uri;
}
# Other servers
include /etc/nginx/conf.d/*.conf;
}
由于常规服务器块中没有任何内容侦听8080端口,因此重定向默认服务器块凭借其在nginx.conf中的位置透明地处理此类请求。
我实际上有四个这样的服务器块,这是一个简化的用例。
发布于 2014-08-13 15:15:38
我无法用其他任何答案来解决我的问题。我解决了这个问题,方法是检查主机是否匹配,如果不匹配,则返回403。(我有一些随机的网站指向我的web服务器内容。我猜是劫持搜索排名)
server {
listen 443;
server_name example.com;
if ($host != "example.com") {
return 403;
}
...
}
发布于 2013-08-24 19:08:35
要回答的小评论:
如果您在sites-available/中的多个配置文件中的多个IP上有多个虚拟主机,则IP的“默认”域将按字母顺序从第一个文件中取出。
正如Pavel所说,"listen“指令http://nginx.org/en/docs/http/ngx_http_core_module.html#listen有"default_server”参数
https://stackoverflow.com/questions/9824328
复制相似问题