Mac本地Django+Nginx+Gunicorn 部署总结

前言:

本文主要记录笔者第一次尝试在 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 工程项目,工程结构如下:

工程结构.png

然后就是对 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系统上运行,来源于Rubyunicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作
(1)执行pip install gunicorn安装
(2)在Django工程settings.py文件的INSTALLED_APPS配置中加入gunicornapp
(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、访问项目

nginxgunicorn服务器都启动成功之后,可以在浏览器中访问定义的API,例如nginxserver中配置的反向代理是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 = ['*']

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容