【问题标题】:How to run multiple Django sites on Nginx and uWSGI?如何在 Nginx 和 uWSGI 上运行多个 Django 站点?
【发布时间】:2011-12-18 01:58:29
【问题描述】:

是否可以使用 Nginx 和 uWSGI 在同一台服务器上运行多个 Django 站点?

我想有必要运行多个 uWSGI 实例(每个站点一个)。我将 /etc/init.d/uwsgi 复制到 uwsgi2 并更改了端口号。但是,我收到以下错误:

# /etc/init.d/uwsgi2 start
Starting uwsgi: /usr/bin/uwsgi already running.

如何运行多个 uWSGI 实例?

谢谢

【问题讨论】:

标签: django nginx uwsgi


【解决方案1】:

您可以创建多个虚拟主机,以允许您托管多个相互独立的站点。更多信息在这里:http://wiki.nginx.org/VirtualHostExample

更多详细信息在这里以及如何设置虚拟主机http://projects.unbit.it/uwsgi/wiki/RunOnNginx#VirtualHosting

【讨论】:

  • 运行2个uwsgi实例的解决方案在第二个链接中:uwsgi --uid 1001 -w customer1app --limit-as 128 -p 3 -M -s 127.0.0.1:3031
  • 如果您在 Emperor 模式下运行 uwsgi,它将处理多个实例(又名 vassal)的创建。您只需要为每个 django 项目创建一个 uwsgi 配置文件。更多信息:uwsgi.readthedocs.org/en/latest/tutorials/…
  • 两个链接都已过时。
【解决方案2】:

您可以使用Emperor Mode 运行多个 uwsgi 实例。

这会处理新工作实例的创建。这些实例被巧妙地命名为vassals。每个 vassal 只需要一个配置文件,该配置文件通常放在(或符号链接)/etc/uwsgi/vassals

对于 nginx,您需要为您希望服务的每个主机创建一个服务器块。只需为您要服务的每个主机更改server_name 指令。这是一个例子:

#Simple HTTP server
server {
    listen   80; 
    root /usr/share/nginx/www;
    server_name host1.example.com;
}

#Django server
server {
    listen   80; 
    server_name host2.example.com;

    #...upstream config...
}

重要提示:确保您已在 /etc/hosts 中指定您的主机名。我发现如果不这样做,我的 django 站点也会在默认服务器 IP 上提供服务,尽管指定它应该只在我的 nginx 配置中的特定主机名上提供服务。

【讨论】:

    【解决方案3】:

    我看到很多建议,例如@donturner 的回答。即在 nginx 配置文件中设置两个或多个不同的server。但问题是每台服务器都需要一个唯一的server_name,或者不同的域名或子域名。这种情况怎么样:我想像这样为两个不同的 Django 项目提供服务:

    www.ourlab.cn/site1/  # first Django project
    www.ourlab.cn/site2/  # second Django project
    

    这样,我们可以在一台服务器上配置所有设置。

    这是我在/etc/nginx/nginx.conf中的设置

    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    }
    

    这是我在/etc/nginx/conf.d/self_configure.conf中的设置

    # /etc/nginx/conf.d/self_configure.conf
    server {
        listen       80;
        server_name  www.ourlab.cn;
    
        # note that these lines are originally from the "location /" block
        root   /mnt/data/www/ourlab;
        index index.php index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    
        # Django media
        location /media  {
            # your Django project's media files - amend as required
            alias /mnt/data/www/metCCS/metCCS/static/media;
        }
    
        location /static {
            # your Django project's static files - amend as required
            # first project's static files path
            alias /mnt/data/www/metCCS/metCCS/static/static_dirs;
        }
        location /static_lip {
            # second project's static files path
            alias /mnt/data/www/lipidCCS/lipidCCS/static/static_dirs;
        }
    
        # match www.ourlab.cn/metccs/*
        location ~* ^/metccs {
            include     uwsgi_params;
            uwsgi_pass  unix:/run/uwsgi/metCCS.sock;
        }
        # match www.ourlab.cn/lipidccs/*
        location ~* ^/lipidccs {
            include     uwsgi_params;
            uwsgi_pass  unix:/run/uwsgi/lipidCCS.sock;
        }
    }
    

    您还需要将 Django 项目的settings.py 文件之一更改为STATIC_URL = '/static_lip/',以便两个项目可以分别使用它们的静态文件。

    一个新发现是nginx 可以自己提供静态文件。即使我们关闭了 uwsgi 和 Django,我们也可以通过浏览器使用这些文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2018-08-11
      • 2011-04-14
      • 2018-10-15
      • 1970-01-01
      • 2021-11-09
      • 2019-11-29
      相关资源
      最近更新 更多