Nginx无法通过Gunicorn代理Django应用程序

时间:2019-06-02 12:42:30

标签: django ubuntu nginx gunicorn

我正在尝试使用Nginx和Gunicorn在Ubuntu Server 18.04中部署Django应用。至少从日志和状态的角度来看,每种工具似乎都能正常工作。

重点是,如果我使用SSH登录到服务器并尝试使用curl,gunicorn能够查看并处理该请求。但是,如果直接写我的IP,我只会得到典型的 Welcome to nginx 主页,并且请求对于gunicorn完全不可见,因此nginx似乎无法找到并将请求传递给gunicorn套接字。

我正在使用nginx 1.14.0,Django 2.2.1,Python 3.6.7,gunicorn 19.9.0和PostgreSQL 10.8

这是我的Nginx配置

server {
        listen 80;
        server_name localhost;

        location /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
                alias /home/django/myproject/myproject;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/run/gunicorn.sock;
        }
}

这些是我的gunicorn.sock

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

和gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/myproject/myproject
ExecStart=/home/django/myproject/myproject/myproject/bin/gunicorn \
        --access-logfile - \
        --workers 3 \
        --bind unix:/run/gunicorn.sock \
        MyProject.wsgi:application

[Install]
WantedBy=multi-user.target

我一直在遵循本指南(https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04),该指南大多数都按预期工作,但是区别在于我的项目不是教程中的全新项目,而是从git中克隆而来回购(但是,它已经过测试并且代码可以正常工作)

我期望已经使用此配置从浏览器访问Django管理员,但事实并非如此。我尝试从浏览器访问我的IP,如果访问/admin,我会收到欢迎使用nginx的消息,还会收到404消息。此外,gunicorn日志中未显示任何请求。

另一方面,如果我通过SSH登录到服务器并执行curl --unix-socket /run/gunicorn.sock localhost,则可以在gunicorn日志中看到curl所完成的请求。

欢迎任何帮助。.我已经在这里待了几个小时,甚至无法从服务器外部获得1个请求。

PD:它也与服务器中的端口无关,因为当我访问IP的根目录时,会收到nginx答案。似乎Nginx根本没有任何配置。

2 个答案:

答案 0 :(得分:1)

在您的nginx配置中,您应该使用正确的server_name而不是localhost

  server_name mydomain.com;

如果没有,您将退回到默认的nginx服务器,该服务器返回“欢迎使用nginx”消息。您可以通过更改服务器顺序,删除nginx默认设置或使用default_server参数来更改默认的虚拟服务器。您还可以收听多个服务器名称。

  listen      80 default_server;
  server_name mydomain.com localhost;
  

如果主机头字段与服务器名称不匹配,则NGINX Plus将请求路由到请求到达的端口的默认服务器。默认服务器是nginx.conf文件中列出的第一个服务器,除非您在listen指令中包括default_server参数以明确指定服务器为默认服务器。

https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers

请记住,进行更改后必须重新加载nginx配置。例如sudo nginx -s reload

答案 1 :(得分:0)

最后,我已经正常工作了。您对nginx的配置是正确的,尽管我真正的问题不是要删除/修改sites_enabled文件夹中nginx的默认配置文件。因此,当我设置listen 80 default_server时,出现以下错误

  

[emerg] 10619#0:0.0.0.0:80中的重复默认服务器   /etc/nginx/sites-enabled/mysite.com:4

无论如何,我的静态文件有问题,我仍然不知道为什么它能那样工作。我需要设置DEBUG = True才能查看管理模块的静态文件。

我将继续为管理面板调查在生产环境中提供静态文件的正确方法。

非常感谢您的帮助!