正确设置 UWSGI 路径

Set path to UWSGI correctly

我正在尝试设置我的 uwsgi,但遇到了问题。当我在我的项目文件夹中设置我的项目路径时,UWSGI 看到了我的 wsgi.py 但没有看到任何其他应用程序,因为它们在一个级别上......但是如果我尝试只为我的项目设置路径文件夹,UWSGI 没有看到我的 wsgi.py...我怎样才能正确设置我的路径?

您可以在下面看到我的项目层次结构和 UWSGI 设置,其中可以看到我的 wsgi.py,但看不到我的应用程序(例如 No module named menuItem)。

层次结构:

root --reddish ---env ---reddish ----article ----menuItem ----myProject -----wsgi.py -----settings.py

UWSGI 设置:

[uwsgi]
virtualenv=/root/reddish/env/
chdir=/root/reddish/reddish/myProject/
module=wsgi:application
env=DJANGO_SETTINGS_MODULE=settings
master=True
plugins=python27
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log

您需要更改为 redish,然后从那里指向您的设置。

chdir=/root/reddish/reddish
env=DJANGO_SETTINGS_MODULE=myProject.settings

如果你的 manage.py 是红色的,在你的 manage.py 座位的同一目录中创建一个目录 'settings',像这样创建默认设置文件 ./settings/settings.py

包括:

try:

    from development_settings import *

except ImportError:

    from default_settings import *

然后,在 settings/development_settings.py 中设置你的配置之后,作为 回退,在 default_settings.py 中,将 manage.py 编辑为:

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

并使 reddish/wsgi.py 成为:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.settings")

application = get_wsgi_application()

因此您将拥有如下目录结构:

     +--conf/uwsgi_params
     |
     +--logs/uwsgi.log 
     |
/root/reddish-__init__.py  # run touch __init__.py if does not exist
             |
             +uwsgi.ini
             |
             +manage.py
             |
             +reddish/__init__.py # run touch __init__.py if does not exist
             |       |
             |       +urls.py
             |       |    
             |       +wsgi.py
             |             
             +settings/__init__.py # run touch __init__.py if does not exist
                      |
                      +settings.py # listed below
                      |
                      +development_settings.py # your development settings
                      |
                      +default_settings.py # your fallback settings

到那时你应该能够摆脱 myProject/settings.py 支持 settings/development_settings.py 还要记住,在这种情况下,应用程序名称在 settings/development_settings.py 和 settings/default_settings.py

应包括行:

ROOT_URLCONF = 'reddish.urls'
WSGI_APPLICATION = 'reddish.wsgi.application'

如果您使用 nginx 作为反向代理,您的 nginx 配置服务器部分应该有:

root /root/reddish/;

location /media {
    alias /root/reddish/media;  #create this directory if does no exist
}

location /static {
    alias /root/reddish/static; #create this directory if does not exist
                                #and use with ./manage.py collectstatic
}

与 nginx 一起使用的 uwsgi_params 文件(在 /root/conf 中)应该包括:

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_ADDR $server_addr;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

然后如果你使用套接字而不是在你的 nginx conf 中设置集群

location / {
       uwsgi_pass unix:///tmp/uwsgi.sock; # or /tmp/%n.sock-adjust uwsgi.ini
       include /root/conf/uwsgi_params;
       proxy_set_header X-Forwarded-Protocol $scheme;
       uwsgi_modifier1 30;
       proxy_set_header HTTP_AUTHORIZATION $http_authorization;
       proxy_set_header  X-Real-IP  $remote_addr;
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header  Host $http_host;
       proxy_redirect  off;
       uwsgi_read_timeout 900;
}; 

Always avoid running your uWSGI instances as root. You can drop privileges using the uid and gid options:

http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#security-and-availability

理想情况下,这意味着您也应该将应用程序移出根文件夹。但目前,你需要修正你的路径

virtualenv=/root/reddish/env/
chdir=/root/reddish/reddish/

另一点是不要将 virtualenv 设置为项目文件的一部分。它们最好分开存放。

这两个路径最好都在 /root/ 文件夹之外。

更新: 您可能需要为每个项目使用不同的 virtualenvs 这一事实并不重要。事实上,在某些情况下,您可能需要为同一个项目使用两个 virtualenvs!考虑一下:假设您目前正在使用 django 1.9。 Django 1.10 即将发布,可能需要升级。然后你为 django 1.10 创建一个新的 virtualenv 如果你把它放在你的项目中现在你有另外 30-40 MB 的代码不属于你。这使得版本控制和备份变得困难。

Virtualenvs 并不是您项目的真正组成部分,但它是您的项目所依赖的 python 安装和第三方库。