通过子域同一个Droplet中的两个或多个Django项目

Kho*_*Phi 2 django nginx gunicorn digital-ocean

我有两个django项目.当这个人访问时,www.example.com我想要django项目A.

当这个人访问时,比如blog.example.com,我希望django项目B能够得到服务.

我如何使用nginx和gunicorn,配置方式实现这一目标?

我已完成子域DNS设置.我需要帮助nginx-gunicorn服务页面.

我使用DO的django的One Click安装,所以如果配置可以沿着他们的设置,将是伟大的.

不知道这个问题是属于这里还是属于serverfault.

aum*_*umo 9

原理是使用nginx作为HTTP请求的代理,将它们代理到两个并行运行两个Django应用程序的gUnicorn实例,具体取决于它们的Host标头.

为此,您需要使用nginx设置两个不同的服务器配置.每个都有不同的server_name.这两个服务器将代理在不同端口上运行的两个不同的gUnicorn实例.

Nginx配置

# Server definition for project A
server {
    listen             80;
    server_name        <projectA domain name>;

    location / {
        # Proxy to gUnicorn.
        proxy_pass             http://127.0.0.1:<projectA gUnicorn port>;
        # etc...
    }
}

# Server definition for project B
server {
    listen             80;
    server_name        <projectB domain name>;

    location / {
        # Proxy to gUnicorn on a different port.
        proxy_pass             http://127.0.0.1:<projectB gUnicorn port>;
        # etc...
    }
}
Run Code Online (Sandbox Code Playgroud)

将两个定义拆分为单独的文件可能更好.还记得将它们链接起来/etc/nginx/sites-enabled/.

新贵配置

这两个文件需要放入/etc/init/.

projecta_gunicorn.conf:

description "Gunicorn daemon for Django project A"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid django
setgid django
chdir /home/django/<path to projectA>

exec /home/django/<path to project A virtualenv>/bin/gunicorn --config /home/django/<path to project A gunicorn.py> <projectA name>.wsgi:application
Run Code Online (Sandbox Code Playgroud)

projectb_gunicorn.conf:

description "Gunicorn daemon for Django project B"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid django
setgid django
chdir /home/django/<path to projectB>

exec /home/django/<path to projectB virtualenv>/bin/gunicorn --config /home/django/<path to projectB gunicorn.py> <projectB name>.wsgi:application
Run Code Online (Sandbox Code Playgroud)

gUnicorn配置

项目A gunicorn.py:

bind = '127.0.0.1:<projectA gUnicorn port>'
raw_env = 'DJANGO_SETTINGS_MODULE=<projectA name>.settings'
Run Code Online (Sandbox Code Playgroud)

项目B gunicorn.py:

bind = '127.0.0.1:<projectB gUnicorn port>'
raw_env = 'DJANGO_SETTINGS_MODULE=<projectB name>.settings'
Run Code Online (Sandbox Code Playgroud)