使用Nginx和UWSGI为多个Django网站提供服务

5
我正在尝试使用Nginx来服务两个Django网站。
我可以很容易地服务其中一个,但是如果我同时激活两个网站,它会将两个URL发送到一个网站。这是我第一次使用Nginx,我通常使用Apache,请耐心等待。
我在启用的sites中有两个网站,看起来像这样:
site1.com:
server{
    server_name www.site1.com;
    listen 69.164.211.85:80;
    access_log /var/www/site1.env/logs/access.log;
    error_log /var/www/site1.env/logs/error.log;

    location /static/ {
            # Point this wherever the static files for your django app are $
            autoindex on;
            alias /var/www/site1.env/Site1/static/;
    }

    location / {
        uwsgi_pass    127.0.0.1:3031;
        include       uwsgi_params;
        uwsgi_param   UWSGI_APPID site1;
        uwsgi_param UWSGI-FILE /var/www/site1.env/Site1/wsgi/site1_wsgi.py;
     }
}

site2.net

server{
        server_name www.site2.net;
        listen 69.164.211.85:80;
        access_log /var/www/site2.env/logs/access.log;
        error_log /var/www/site2.env/logs/error.log;

        location /static/ {
                # Point this wherever the static files for your django app are $
                autoindex on;
                alias /var/www/site2.env/Site2/static/;
        }

        location / {
            uwsgi_pass    127.0.0.1:3032;
            include       uwsgi_params;
            uwsgi_param   UWSGI_APPID site2;
            uwsgi_param UWSGI-FILE /var/www/site2.env/Site2/wsgi/site2.py;
         }

}

我也在运行两个UWSGI实例,这些实例使用以下脚本启动:

网站1:

description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec /usr/local/bin/uwsgi \
--home /var/www/site1.env/Site1/ \
--socket 127.0.0.1:3031 \
--chmod-socket \
--module site1_wsgi \
--pythonpath /var/www/site1.env/Site1/wsgi \
-H /var/www/site1.env

网站2:

description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec /usr/local/bin/uwsgi \
--home /var/www/site2.env/Site2/ \
--socket 127.0.0.1:3032 \
--chmod-socket \
--module site2 \
--pythonpath /var/www/site2.env/Site2/wsgi \
-H /var/www/sit2.env

这是我的nginx.conf文件的样子:
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

   ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/$

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

   ##
# Logging Settings
    ##
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/$

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

我本来以为将uwsgi_pass设置为不同的端口会防止它们进入相同的端口,但很明显我错了。我希望能得到任何帮助,谢谢!
2个回答

3
啊,可能是因为我没有将服务器名字中不带“www”的部分包含进去,当我这样做时似乎可以工作。

我想知道如果你在上述设置中没有使用 www. 前缀进行调用,那么谁来处理这些请求呢?你是否有一个默认的 server { server_name _; } 定义? - Tisho
1
@Tisho 没有,我已经禁用了默认设置。我有一种感觉它会发送到第一个激活的设置。 - DNN

1

nginx配置看起来没问题。我用相同的代码(指向不同端口的两个不同站点)进行了测试,并在端口上启动了监听器 - 每个站点都进入指定的端口。

我对uwsgi配置有些疑虑,尤其是环境/路径设置。 请尝试以下操作 - 创建一个uwsgi1.conf文件,并将以下内容粘贴到其中:

[uwsgi]
socket = 127.0.0.1:3031
master = true
processes = 8
env = DJANGO_SETTINGS_MODULE=site1.settings
chdir = /var/www/site1.env/Site1/
pythonpath = /var/www/site1.env/
module = django.core.handlers.wsgi:WSGIHandler()
-H /var/www/site1.env

还有一个名为uwsgi2.conf的文件,其内容如下:

[uwsgi]
socket = 127.0.0.1:3032
master = true
processes = 8
env = DJANGO_SETTINGS_MODULE=site2.settings
chdir = /var/www/site2.env/Site2/
pythonpath = /var/www/site2.env/
module = django.core.handlers.wsgi:WSGIHandler()
-H /var/www/site2.env

如果需要,更改env/、chdir、pythonpath的值。然后按如下方式启动站点:

respawn
exec /usr/local/bin/uwsgi --ini /path/to/uwsgi1.conf

和第二个的uwsgi2.conf


我刚刚做了那个,但我仍然遇到同样的问题。我可能还有其他遗漏的东西吗? - DNN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接