正确设置 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 安装和第三方库。
我正在尝试设置我的 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 安装和第三方库。