Django使用nginx部署 - 来自另一台服务器的gunicorn

时间:2018-04-27 12:18:18

标签: django nginx gunicorn

我正在尝试通过不同的应用服务器部署Django ProjectApache2Nginx/gunicorn,...

它适用于Apache2Nginx,但我想将这些应用服务器与Django Projet分离。我想得到这样的环境:

  • 服务器1(172.30.10.92):Django Project& WSGI
  • 服务器2(172.30.10.93):Nginx / gunicorn

为什么?因为稍后我会有一些Django应用程序,但我想只使用一个应用程序服务器。

我认为我的配置文件语法错误。

我有 /etc/nginx/sites-available/DatasystemsCORE.conf

server {
    listen 8000;
    server_name 172.30.10.92; 

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

    location /static/ {
            root http://172.30.10.92:/var/www/html/;
    }

    location / {
            include proxy_params;
            proxy_pass http://172.30.10.92/unix:/var/www/html/DatasystemsCORE/dscore.sock;
    }
}

server_name:是来自Django服务器还是nginx服务器的IP地址?我认为这是第一个,但我不确定。

proxy_pass:我认为我的路径存在问题

然后,我正在执行此命令:

gunicorn --daemon --workers 3 --bind 172.30.10.92/unix:/var/www/html/DatasystemsCORE/dscore.sock 172.30.10.92:/var/www/html/DatasystemsCORE/DatasystemsCORE.wsgi

还有一次,我认为存在语法问题,因为我得到了502 Bad Request

如何从远处的Django服务器添加IP地址?

谢谢!

2 个答案:

答案 0 :(得分:1)

你想要做的事没有任何意义。您当然可以在单独的服务器上使用单个nginx,但gunicorn是应用程序服务器并且属于该应用程序。

没有“Django服务器”所以你的第一个问题是无关紧要的。 gunicorn需要在端口上服务,而不是套接字,nginx proxy_pass将指向该端口。

答案 1 :(得分:1)

我找到了如何解决我的问题,并根据我的情况制作了一个教程,以帮助每个想要做同样事情的人。

我的档案在那里:Download tutorial file

但这是用英文写的教程。

我的Django IP服务器:172.30.10.92

我的Nginx IP服务器:172.30.10.93

1-安装和配置wsgi(位于Django服务器上)

WSGI是使用Django项目创建的文件。

该文件位于/path/to/your/project/Myproject/wsgi.py

我们必须像这样编辑这个文件:

import os
from django.core.wsgi import get_wsgi_application

import sys sys.path.append('/var/www/html/Myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Myproject.settings")
application = get_wsgi_application()

2-安装和配置gunicorn / supervisor(位于Django服务器上)

为了安装gunicorn / supervisor,你必须在你的shell中执行:

pip install gunicorn
pip install supervisor

然后,您必须在/etc/supervisor/conf.d/Myproject.conf中创建一个新文件,如下所示:

[program:Myproject]
command = /home/valentin/.virtualenvs/MyprojectEnv/bin/gunicorn Myproject.wsgi:application --name "Myproject" --workers=4 --bind=0.0.0.0:8080 -- user="valentin" --group="valentin" ; Command to start app
user = username #You have to replace by your username
stdout_logfile = /var/log/supervisor/supervisor.log
redirect_stderr = true
log
environment=LANG=fr_FR.UTF-8,LC_ALL=fr_FR.UTF-8

我指定了端口8080 ,这是我的应用服务器和我的网络服务器之间的通信端口。

3-编辑nginx服务器上的主机文件(位于nginx服务器上)

您必须编辑位于/etc/hosts的主机文件并向Django服务器添加新条目:

127.0.0.1 localhost 
127.0.1.1 valentin 
172.30.10.92 Myproject

# The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

4- nginx存储库中的新配置文件(位于nginx服务器上)

此新文件应放在/etc/nginx/sites-available/Myproject.conf

 server {
    listen 8080;
    server_name Myproject;

    root /var/www/html/Myproject/;

    location /static/ {
        root /var/www/html/;
    }

    location / {
        include proxy_params;
        proxy_pass http://172.30.10.92:8080;
        }       
}

IP地址对应于我的Django服务器地址。我指定了监听端口(8080),我的Django项目的路径&静态目录。

然后,您必须创建指向已启用网站的符号链接。

操作完成后,重新启动nginx服务:

sudo service nginx restart

5-允许Django中的nginx IP地址(位于Django服务器上)

您必须编辑 settings.py 文件,以便在 ALLOWED_HOSTS 中允许nginx IP地址:

ALLOWED_HOSTS = ['localhost', '172.30.10.93', '127.0.0.1', '[::1]']

6-最后执行gunicorn(位于Django服务器上)

最后,你必须开始枪手。您应该在Django根项目中并执行:

gunicorn Myproject.wsgi:application --bind 172.30.10.92:8080

现在,在您的浏览器中,尝试使用端口连接到您的nginx服务器:

http://172.30.10.93:8080

有效!

PS:这个教程适合我,如果它不适合你,也许我错过了一些东西,或者你没有像我一样;)