前言:
本文主要记录笔者第一次尝试在 MacOS 上对Django+Gunicorn+Nginx进行部署的遇到的一些问题与感受
链接:
Django: https://docs.djangoproject.com/en/2.0/
Nginx:http://nginx.org/en/docs/
Gunicorn:http://gunicorn.readthedocs.io/en/latest/
摘要:
1、Django项目配置说明
前提是已经拥有一个完整的 Django 工程项目,工程结构如下:
然后就是对 Django 工程的
settings.py
文件一些内容修改:
(1)DEBUG
修改为 False
在Django项目中,DEBUG是为了方便开发者进行调试工程模式,当值为 True 时,运行系统会默认加载静态资源文件,所以关闭 调试模式之后,才可以使用 nginx 服务器代理加载静态文件
(2)ALLOW_HOSTS
中加入域名或者服务器 ip
例如 ALLOWED_HOSTS = ['127.0.0.1','example.com']
(3)设置STAIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static') 或者指定的文件路径
(4)执行python3 manager.py collectstatic
作用是将工程中的所有静态文件(image、js、css)都都收集到 STATIC_ROOT 指定的文件中,便于后续 nginx 是配置
2、Gunicorn配置说明
Gunicorn详细配置说明博客: https://www.cnblogs.com/nanrou/p/7026789.html
gunicorn
是一个python Wsgi http server
,只支持在Unix
系统上运行,来源于Ruby
的unicorn
项目。Gunicorn
使用prefork master-worker
模型(在gunicorn
中,master
被称为arbiter
),能够与各种wsgi web
框架协作
(1)执行pip install gunicorn
安装
(2)在Django
工程settings.py
文件的INSTALLED_APPS
配置中加入gunicorn
的app
(3)进入工程文件,执行gunicorn 工程名.wsgi
来快速启动gunicorn 服务器
(4)另外也可以通过创建配置gunicorn.conf.py
来实现,配置内容如下:
import multiprocessing
bind = "127.0.0.1:8000" #绑定的ip与端口
workers = multiprocessing.cpu_count() * 2 + 1 #进程数
errorlog = '/Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/gunicorn.error.log' #发生错误时log的路径
# accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常时的log路径
proc_name = 'gunicorn_TTSXProject' #进程名
timeout = 30 #超时
threads = 2 #指定每个进程开启的线程数
(5)启动:gunicorn 工程名.wsgi:application -c 文件路径/gunicorn.conf.py
或者在工程目录下执行gunicorn 工程名.wsgi:application -c gunicorn.conf.py
(6)关闭gunicorn
:
lsof -i:pid进程ID
:查询到使用中的端口
kill -9 pid进程ID
:释放端口
kill -HUP pid进程ID
:重启任务
3、Nginx配置说明
(1)安装
brew update //结果:Already up-to-date.
brew install nginx
(2)路径
mac 上的配置路径为:/usr/local/etc/nginx/nginx.conf
mac 上的安装路径为:/usr/local/Cellar/nginx
(3)启动
nginx
:启动 nginx 服务器
nginx -s reload
:重启 nginx 服务器
pkill -9 nginx
:彻底关闭 nginx 服务器
nginx -s stop
:关闭服务器
默认启动8080
端口,所以nginx
服务器启动之后在浏览器上访问127.0.0.1:8080
进入nginx欢迎界面
(4)配置django 工程
与nginx
关联文件
可以直接在django
项目中创建一个nginx.conf
文件,添加如下内容:
server {
# nginx 监听的端口
listen 80;
#服务器 ip 域名
server_name 127.0.0.1 example.com;
#指定配置 log 文件路径
access_log /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.access.log;
error_log /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.error.log;
location / {
# nginx 代理指向地址,即访问 8000 端口时,直接交给 gunicorn 处理
# django 中的静态文件也属于 8000 端口访问
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 访问一些其他静态文件,直接交给 nginx 处理,
# 可以指向 django 项目中配置的 STATIC_ROOT 路径
# alias :直接查询指定路径
# root :会在指定路径后面添加上 static/
location /static/ {
alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/;
}
location /media/ {
alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/upload/;
# 缓存时间
expires 30d;
}
}
(5)关联配置文件
sudo ln -s 项目路径/nginx.conf /usr/local/etc/nginx/servers/定义名字.conf
此时在/usr/local/etc/nginx/servers/
目录下会发现关联的 项目配置文件,同时可以再次启动nginx
服务器
4、访问项目
将nginx
、gunicorn
服务器都启动成功之后,可以在浏览器中访问定义的API,例如nginx
的server
中配置的反向代理是127.0.0.1
,监听端口是80
,则直接访问127.0.0.1
即可
----------------------------------------------------------------------------------------------------
分割线------分割线------分割线------分割线
----------------------------------------------------------------------------------------------------
5、配置过程中遇到的问题
(1)PermissionError(13, 'Permission denied')
当输入终端命令时,提示这个错误,证明是命令权限错误,
解决方法:需要在执行的命令前加上sudo
(2)通过 nginx 访问出现 403 Forbidden errors
当通过nginx访问一些静态文件资源时报错 403,原因可能有两个
a、配置权限不够
解决方案:在 nginx.conf
中修改 nginx
启动用户,即user 用户名 wheel
b、目录索引设置错误
解决方案:查找检测文件索引配置并更正索引
注意:
当通过 nginx 访问时,一直无法加载静态文件,并返回403,证明是第一种情况
(3)ajax访问请求出现[No 'Access-Control-Allow-Origin' header is present on the requested resource.'](http://blog.csdn.net/zhoucheng05_13/article/details/53580683)
这是当前使用 Ajax
访问出现了跨域请求错误,需要在服务的进行添加响应头配置
解决方案:
# 在`view.py`中的响应方法中添加
response = HttpResponse(json.dumps(context), content_type="application/json")
# 解决 ajax 跨域请求问题
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"
(4)当Django
项目设置为DEBUG=False
时,访问报错:Bad Request (400)
此时可能是因为ALLOWED_HOSTS
的设置出现问题,导致访问出错
解决方案:将ALLOWED_HOSTS
进行如下设置:
ALLOWED_HOSTS = ['*']