Nginx的configuration子域performance出奇怪的行为

我有两个相同的小滴在数字海洋上运行。 运行Ubuntu 14.04与nginx,gunicorn和Django。

我试图把我的一个子域放到一个水滴的IP上。 在另一个液滴,我已经成功地停放了一个子域,并且按照预期工作。

现在,问题小滴似乎只能通过液滴的IP地址正确连接。 通过访问IP地址,gunicorn实例可以被完美地看到,并且代理到gunicorn端口:9000不需要访问它。

通过访问在我的域名注册商处添加了一个Alogging的子域,指向这个液滴的IP,我被nginx的欢迎页面欢迎,说nginx需要更多的configuration

通过访问子域名并附加gunicorn端口:9000我被Django应用程序迎接,但是它不像当访问液滴的IP地址时那样提供静态文件。 另外,如果我访问IP地址并追加:9000端口,它具有相同的效果。

我对nginx的configuration在两个水滴上是相同的,唯一的区别是server_name的IP地址。

 server { server_name *.*.*.*; access_log off; location /static { alias /opt/venv/static; } location /media { alias /opt/venv/media; } location / { proxy_pass http://$server_name:9000; proxy_redirect off; 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_set_header X-Forwarded-Host $server_name; } } 

我也试图设置server_name到子域也是无济于事。

我错过了什么吗? 为什么这个工作在一个液滴而不是另一个?

编辑:添加configuration为gunicorn

 command = '/opt/venv/bin/gunicorn' pythonpath = '/opt/venv/fjarrtoolbox' bind = '127.0.0.1:9000' workers = 3 

这一行:

 proxy_pass http://$server_name:9000; 

应该:

 proxy_pass http://127.0.0.1:9000; 

这种改变将通过本地环回接口有效且安全地将stream量路由到后端。

此外,Gunicorn应该configuration为绑定到端口127.0.0.1,因为它只能通过Nginx访问。 如果你不需要的话,你可以通过公开的方式邀请其他问题。

以下是当前configuration可能出现的问题。 有人可以用这样的第三方主机名称向您的服务器发送请求:

 curl -H 'Host: example.com' http://1.2.3.4/Hello 

您的server_name将接受匹配任何主机名称的请求,所以请求将被处理,然后请求将被代理到其端口“9000”上的“example.com”。 假设这是别人的Gunicorn服务器也打开了端口9000。 现在,由于您正在运行一种开放代理的forms,因此可能会向您发送的Gunicorn服务器发起的攻击stream量来自您的IP地址。

这就是为什么使用显式值server_nameproxy_pass主机和为什么后端服务器应显式绑定到端口127.0.0.1。