为两个django应用程序正确定义Nginx服务器块而没有server_name

时间:2016-02-05 18:19:03

标签: django nginx uwsgi

我一直在关注数字海洋教程How To Serve Django Applications with uWSGI and Nginx on Ubuntu 14.04,以便稍后我可以使用Nginx + uWSGI部署我自己的django应用程序。

在本教程中,他们创建了2个基本的Django应用程序,稍后将由Nginx提供服务。我已经测试过应用程序只使用Django服务器和uWSGI。

当我传递到Nignx部分时遇到了问题,基本上我没有server_name,现在只有一个IP可以使用,我试图用端口号区分Django应用程序。

默认的Nginx服务器(xxx.xxx.xxx.xxx:80)正确响应,但是当我尝试使用(xxx.xxx.xxx.xxx:8080或xxx.xxx.xxx.xxx)访问Django应用程序时:8081)我得到502坏网关。

我认为我在服务器块中定义 listen 的方式或逻辑存在问题。这样做的正确方法是什么,或者我可能做错了什么。

这是我的服务器块(在已启用网站的情况下):

firstsite app

server {
    listen xxx.xxx.xxx.xxx:8080;
    #server_name _;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /root/firstsite;
    }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/root/firstsite/firstsite.sock;
    }
}

econdsite app

server {
    listen xxx.xxx.xxx.xxx:8081;
    #server_name _;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /root/secondsite;
   }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/root/secondsite/secondsite.sock;
   }
}

默认Nginx

server {
    listen 80 default_server;
    #listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules
    }
}

更新

我正在检查/ var / log / nginx下的错误日志,当我尝试连接到firstsite时,我收到以下错误:

  

2016/02/05 15:55:23 [暴击] 11451#0:* 6连接()到   unix:/root/firstsite/firstsite.sock失败(13:权限被拒绝)   连接上游时,客户端:188.37.180.101,服务器:,   请求:“GET / HTTP / 1.1”,上游:   “uwsgi:// unix:/root/firstsite/firstsite.sock:”,主持人:   “178.62.229.183:8080”

1 个答案:

答案 0 :(得分:2)

默认情况下,ubuntu上的Nginx服务器将在mdl用户上运行,uWSGI服务器赢了(这实际上是一件好事,除非它在root上运行)。如果您正在为uWSGI创建unix套接字,则将定义对任何系统文件的访问权限。默认情况下,对它的访问可能仅限于创建套接字的用户。

更多相关信息,您可以在www-data目录中创建套接字。该目录只有root用户才能读取,即使权限设置正确,一些Linux发行版也不允许访问任何内容。

所以你需要做的是:

  1. 将套接字放在/root/目录之外(/root/是个好地方)
  2. 确保nginx可以访问该套接字(将/var/run或`--chown-socket yourusername:www-data放入uWSGI启动行)
  3. 如果您在root上运行该uWSGI服务器,请注意这是非常危险的。在root上运行的任何进程都可以对您的系统执行任何操作,因此如果您在代码中出错或有人入侵,他可以将任何恶意软件注入您的服务器,从中窃取一些数据或者只是销毁所有内容。