更新uwsgi和nginx更改,无需重启服务

时间:2015-12-05 15:56:14

标签: django ubuntu nginx uwsgi


我正在考虑制作一个动态添加新的django网站和静态网站的django应用程序 我可以做所有的步骤,但问题是,如果我有很多用户试图添加网站,如果每次添加一个网站,我必须服务uwsgi启动/停止和服务nginx重新启动..该网站将有用户试图访问它时的问题 是否可以通过重新启动服务来更新更改? 任何帮助或建议都会被贬低。 谢谢!

1 个答案:

答案 0 :(得分:0)

首先,让我们从uWSGI开始。

如果您尝试在一个uWSGI服务器上启动所有应用,那么您做错了。每个django应用程序都需要单独的uWSGI服务器......

...并且uWSGI内置了解决方案:emperor and vassals。只需将emperor配置为主要的uWSGI服务,并配置它可以动态启动和停止vassal而无需重新启动自身。这样,如果有人会更改django应用程序的配置,只会启动/停止或重新加载一个附庸(必须发生的事情,你无法避免)。

现在让我们配置nginx

遗憾的是,很难实现nginx。首先,您不必重新启动nginx,您可以使用服务nginx重新加载来优雅地重新加载它的配置。但如果你对此不满意,还有另一种解决方案。

要使该解决方案正常工作,所有django项目必须具有完全相同的nginx配置(如果你想在它们之间创建一些差异,检查它是否可以在uWSGI中实现,使用聪明的nginx配置,你将能够使用任何uWSGI功能)。如果可以满足此要求,请执行以下操作:

  1. 创建用于捕获所有可能的django网站的配置文件(每个网站必须位于不同的域),它看起来像这样:

    server {
        server_name   ~^(www\.)?(?<domain>.+)$;
        # server_name can contain any regular expression. Just remember that it should start with `~` and contain `^` and `$`
        # as you can see, we can use named capture group as an variable later
        # you can add any named capture group for later use
    
        root   /sites/$domain/public;
    
        location @default {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            include /etc/nginx/uwsgi_params;
    
            uwsgi_pass unix:/run/uwsgi/${domain}.sock;
            break;
        }
    
        location /static/ {
            try_files $uri @default;
        }
    
        location /media/ {
            try_files $uri @default;
        }
    
        location ~* ^/(android-(?:chrome|icon)[-0-9x]*\.png|ms(?:tile|-icon)[-0-9x]*\.png|browserconfig.xml|apple-(?:touch-)?icon[-0-9x]*\.png|favicon[-0-9x]*.png|favicon\.ico|manifest.json|apple-touch-icon-precomposed\.png)$ {
            try_files $uri /static/favicon$uri @default;
        }   
    
        error_page 500 502 503 504 /500.html;
        location = /500.html {
            try_files /500.html /error.html /error500.html;
        }
    
        location / {
            try_files /maintenance.html @default;
        }
    }
    
  2. 将每个项目存储在对其进行修补的目录中,以某种方式匹配域名。如果要将每个项目存储在它所属的用户目录中,则该目录名必须包含在URL中。

    换句话说,您必须能够通过其域构建要投影的目录。

    您可以通过创建一个包含符号链接到实际项目目录的全局目录来破解该限制。

    注意!! 可能存在安全漏洞!如果有人将创建目录,哪个路径将匹配主机名,nginx将在该主机名上提供该目录。即使域名不指向您的服务器,也有人可以访问它。所以你应该更好地使用带有符号链接的全局目录的方法来实际项目。

  3. 确保也可以从域名创建到uWSGI服务器的套接字。你也可以在这里使用符号链接。