2015-12-05 111 views
0


我正在考虑制作一个将动态添加新django网站和静态网站的django应用程序。
我可以做所有的步骤,但问题是,如果我有很多用户正在尝试添加网站,如果每次添加一个网站,我必须服务uwsgi开始/停止和服务nginx重新启动..网站当用户尝试访问它时会遇到问题。
有没有解决方案,我如何更新重新启动服务的变化?
任何帮助或建议将被认为是优先的。 谢谢!更新uwsgi和nginx更改无需重新启动服务

回答

0

首先,我们从uWSGI开始。

如果您尝试在一台uWSGI服务器上启动所有应用程序,则表明您的操作有误。每个django应用程序应该需要单独的uWSGI服务器...

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

现在,让我们配置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服务器也可以从域名创建。你也可以在这里使用符号链接。

相关问题