前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django+nginx+gunicorn部署配置

django+nginx+gunicorn部署配置

作者头像
earthchen
发布2020-09-24 11:28:07
6.9K0
发布2020-09-24 11:28:07
举报
文章被收录于专栏:earthchen的专栏earthchen的专栏

在部署django开发的站点时,通常有两种选择方式,nginx+django+uwsgi或者django+nginx+gunicorn,本文不讨论apache方式,在linux下通常都使用nginx,速度快,还经常做代理服务器,功能强大。。 nginx+django+uwsgi个人觉得uwsgi配置较为麻烦,所以选择了gunicorn,一个开源Python WSGI UNIX的HTTP服务器,据说速度快(配置快、运行快)、简单,默认是同步工作,支持Gevent、Eventlet异步,支持Tornado。有兴趣可以自行查阅官方文档

django+nginx+gunicorn

环境安装

需要在服务器端安装我们所需要的环境nginx Python nginx gunicorn… django等站点需要的依赖将不进行介绍

nginx

在ubuntu上支持apt-get 直接安装,其他系统请自行搜索安装方式

代码语言:javascript
复制
$ sudo apt-get install nginx

gunicorn

gunicorn只是一个Python的库 这里建议使用pip安装,简单方便 ps:要么网络好,要么建议更改pip源为豆瓣源

代码语言:javascript
复制
$ sudo pip install gunicorn

注:

  • 如果没有pip需要首先安装pip
  • 如果是Python3 请使用pip3
  • 由于服务器就跑一个Python应用,就使用了全局安装,如果你的服务器上运行了多个Python应用,并使用了不同的环境(版本号),建议使用不同的虚拟环境

环境配置

其实也很简单,要想简单的跑起来只需要更改几个配置文件即可 首先请把你的django站点放在服务器合适的地方

nginx配置

一般网站都配置在80端口上,域名默认解析到80端口,所以nginx配置文件如下,在更改nginx的配置文件之前建议把默认文件进行备份,以备后续出现问题参照使用 打开nginx配置文件/etc/ningx/sites-enable/default 进行修改为如下内容:

代码语言:javascript
复制
server {
    listen 80;
    server_name 192.168.84.199;
    server_name_in_redirect off;
    access_log /home/webserver/web/nginx.access.log;
    error_log /home/webserver/web/nginx.error.log;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_pass_header       Authorization;
        proxy_pass_header       WWW-Authenticate;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        root /home/webserver/web/WebServer/;
    }

核心配置文件就上述那么多,重点使将请求转发到django的服务器上

注:

  • listen是所需要监听的端口
  • server_name是需要绑定的域名,暂时没有域名时,请使用ip
  • access_log是确定正常状态下log文件位置
  • error_log使确定发生错误时log文件位置
  • location / 是当访问到根下的时候,将所有请求转发到127.0.0.1:8000,本文使转发到gunicorn启动的django应用上,中间配置的是需要转发的内容,基本上述内容可以满足大多需求,如需特殊需求请自行查看nginx官方文档
  • location /static/ 配置了静态文件所在的路径,静态文件由nginx处理,动态转发到django,如不配置会出现站点引用的所有js css都找不到

gunicorn配置

gunicorn启动一般有两种方式,可以在项目目录下建立gunicorn.conf.py配置文件,也可以在启动gunicorn时直接加上相关命令

需要在项目的settings.py中的INSTALLED_APPS添加gunicorn:
代码语言:javascript
复制
INSTALLED_APPS = [
    ...
    ...
    'gunicorn',  # 部署用
]
gunicorn.conf.py文件
代码语言:javascript
复制
import multiprocessing

bind = "127.0.0.1:8000"   #绑定的ip与端口
workers = 2                #核心数
errorlog = '/home/xxx/xxx/gunicorn.error.log' #发生错误时log的路径
accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常时的log路径
#loglevel = 'debug'   #日志等级
proc_name = 'gunicorn_project'   #进程名

如还需要其他配置,可以自行查看官方文档

直接使用gunicron启动

gunicron需要启动后需要长期运行在后台,如果直接启动会在关闭终端后进程就被杀死,这肯定不是我们的需求,所以这里给出两种解决方式

  1. 使用Linux自带的nohup命令 不使用gunicorn配置文件(需进入项目目录)$ sudo nohup gunicorn 项目名.wsgi:application -b 127.0.0.1:8000&

使用配置文件方式

代码语言:javascript
复制
$ sudo nohup gunicorn 项目名.wsgi:application -c /home/xxx/xxx/gunicorn.conf.py&
  1. 使用supervistor进程管理器supervistor这个工具的用法这里就不在多讲,需要了解可以看我的另一篇博客ubuntu下的进程控制系统—Supervisor,也可以直接查看官方文档用法可以参照我的配置文件:
代码语言:javascript
复制
[program:x508server]
command=gunicorn x508server.wsgi:application -b 0.0.0.0:8000  ; 被监控的进程路径
directory=/home/webserver/web/WebServer/               ; 执行前要不要先cd到目录$
autostart=true                ; 随着supervisord的启动而启动
autorestart=true              ; 自动重启。。当然要选上了
startretries=10               ; 启动失败时的最多重试次数
exitcodes=0                   ; 正常退出代码
stopsignal=KILL               ; 用来杀死进程的信号
stopwaitsecs=10               ; 发送SIGKILL前的等待时间
redirect_stderr=true          ; 重定向stderr到stdout
stdout_logfile=/home/webserver/web/logfile.log        ; 指定日志文件
; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进$
stopasgroup=true             ; send stop signal to the UNIX process
; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进$
killasgroup=true             ; SIGKILL the UNIX process group (def false)
  1. 加载nginx配置文件重启nginx 123 sudo service nginx reload sudo service nginx restart //执行一种即可
  2. 启动gunicorn
  • 如果使用supervistor: $ sudo supervisorctl reload
  • 如果使用nohup $ sudo nohup gunicorn 项目名.wsgi:application -b 127.0.0.1:8000&

特殊配置

  1. 在一些前后端分离项目,可能还需要配置前端静态页面,此时就不能将所有url都转发到django了,需要配置一个前缀,但此时,django自带的后台管理也会出现问题,建议配置一个/admin,所以,最后我的配置nginx文件如下:
代码语言:javascript
复制
server {
    listen 80;
    server_name 192.168.84.199;
    server_name_in_redirect off;
    access_log /home/webserver/web/nginx.access.log;
    error_log /home/webserver/web/nginx.error.log;

    index login.html;
    root /home/webserver/web/html/WebHtml/;

    location / {
        try_files $uri $uri/ =404;
    }

    location /apis {
        rewrite ^.+apis/?(.*)$ /$1 break;
        proxy_pass http://127.0.0.1:8000;
        proxy_pass_header       Authorization;
        proxy_pass_header       WWW-Authenticate;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /admin {
        proxy_pass http://127.0.0.1:8000;
        proxy_pass_header       Authorization;
        proxy_pass_header       WWW-Authenticate;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

    location /static/ {
        root /home/webserver/web/WebServer/;
    }
  1. 收集使用的admin或者其他库含有的静态文件 在django项目的settings.py添加如下代码:
代码语言:javascript
复制
# 收集app静态文件到项目目录使nginx能访问到
STATIC_ROOT = os.path.join(BASE_DIR, "static")

# 执行python manage.py collectstatic
STATICFILES_FINDERS = (
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder"
)

然后在终端中进入项目目录在终端执行:

代码语言:javascript
复制
$ python manage.py collectstatic

将会自动将app中所含有的静态文件自动收集到项目的setting目录下,解决了某些app,比如admin在部署后找不到静态文件的现象

注:

  • 上述环境在ubuntu16.04 lts中搭建测试成功
  • 上述文字皆为个人看法,如有错误或建议请及时联系我
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-30,,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • django+nginx+gunicorn
    • 环境安装
      • nginx
      • gunicorn
    • 环境配置
      • nginx配置
      • gunicorn配置
    • 特殊配置
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档