美文网首页
用uWSGI+django+nginx部署django

用uWSGI+django+nginx部署django

作者: 几事当欢 | 来源:发表于2020-03-14 15:33 被阅读0次

笔者参考了https://blog.csdn.net/c465869935/article/details/53242126中的内容,还是比较全面的。在此基础上笔者补充了一些自己遇到的问题的解决方法。下面的内容也摘录于这个blog,放在此处做个简单介绍:
wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;

uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。

uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

Steps

  1. install uwsgi
pip install uwsgi
  1. install nginx
    这里需要装一些额外的组件:
  • 先安装一些编译需要的组件
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++
  • 安装pcre
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
tar zxvf pcre-8.40.tar.gz
cd pcre-8.40
./configure && make && make install
  • 安装zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
tar zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure && make && make install
  • 安装openssl
wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz
tar zxvf openssl-fips-2.0.10.tar.gz
cd openssl-fips-2.0.10
./config && make && make install
  • 安装nginx
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar zxvf nginx-1.10.2.tar.gz
cd nginx-1.10.2
./configure && make && make install

安装好之后试了一下发现找不到nginx这个命令,捣鼓了下发现是nginx所在目录并没有被添加到环境变量里面(这个比较奇怪,一般来说安装程序应该能搞定,先不管,添加到环境变量里面再说)

export PATH=/usr/local/nginx/sbin:$PATH
  1. 配置nginx和uwsgi
  • 先确定nginx.conf文件所在
nginx -t

命令应该返回:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  • 复制conf文件并修改
    先在自己的工程目录中新建一个nginx的文件夹方便配置文件的归档(后续所说的所有配置文件都放在这个文件下),然后将nginx.conf文件copy到此目录中,以笔者为例,结构如下:
/home/lhuang/01Git/kiwi_dev
/home/lhuang/01Git/kiwi_dev/nginx
/home/lhuang/01Git/kiwi_dev/nginx/nginx.conf

打开nginx.conf的文件,然后将其中server段落删除,然后修改如下:

server {
    listen       8080;
    server_name  localhost;
    charset      utf-8;
    access_log   /home/lhuang/01Git/kiwi_dev/nginx/nginx_access.log;
    error_log    /home/lhuang/01Git/kiwi_dev/nginx/nginx_error.log;
    client_max_body_size 75M;
    location /static {
        alias /Kiwi/static;
    }

    location  / {
        include /usr/local/nginx/conf/uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
    }
}

其中两个location中的aliasinclude中的内容必须按照自己实际的文件位置修改。
对于alias后面来说,是django项目的静态文件位置,这个文件位置从何处获取,笔者还是小折腾了下,以下为步骤:

  1. 打开django的setting文件,确认其中STATIC_ROOT的配置(自己可以按自己的想法修改,确认你找得到就行)
STATIC_ROOT = '/Kiwi/static/'
  1. 运行如下django命令,将所有的static文件都汇总到上述文件目录中
python ./manage.py collectstatic

include中的文件在我们之前获取的nginx config目录下面。

  • 创建uwsgi.ini文件,并填入内容:
[uwsgi]
socket = 127.0.0.1:9090
chdir=/home/lhuang/01Git/kiwi_dev/
module=tcms.wsgi
master = true
processes=2
threads=2
max-requests=2000
chmod-socket=664
vacuum=true
daemonize = /home/lhuang/01Git/kiwi_dev/nginx/uwsgi.log

其中socket必须和nginx.conf中uwsgi_pass严格一致
其中chdir为我们的django工程目录,module这个比较不好理解,这里着重说下。
每个django项目都自带一个wsgi.py的文件,而这个module就是指这个文件的相对目录,如笔者的系统结构是这样的:

/home/lhuang/01Git/kiwi_dev/tcms/wsgi.py

所以此处的moduel为tcms.wsgi
daemonize为log文件,此处我们也统一放到nginx文件下

  1. 启动服务
    配置文件全部生成完成之后,就可以启动服务了。
  • 先启动uwsgi:
uwsgi --ini uwsgi.ini

此处uwsgi.ini为之前我们创建的文件,命令中用的是相对目录,所以上述命令是在nginx文件下执行的。
成功会打印:

[uWSGI] getting INI configuration from uwsgi.ini
  • 再启动nginx
nginx -c /home/lhuang/01Git/kiwi_dev/nginx/nginx.conf

此处路径必须用绝对路径,笔者试了相对路径,失败。
都启动完就可以登陆web试下效果了。

  1. 如果出错了
    最好没问题,如果出了那就得调试了,笔者调试过程中也趟了一些坑,主要原因是django的配置问题,nginx+uwsgi的配置基本没问题。
    在nginx文件下面有三个log文件:
nginx_access.lo
nginx_error.log
uwsgi.log

目前来看,前两个笔者没怎么用到,但是uwsgi.log还是挺有用的,可以看到一些错误,便于debug。另外setting中的ADMINS一定要配置上自己的邮箱,作用就是nginx本上看不到什么错,只有网页上500/502之类的错,根本看不出什么,而如果我们配了这个邮箱,nginx出错了,django会发邮件给你,因为笔者在试的这个项目是基于开源项目 进行的,所以也不确定这个功能是不是django自带的,如果没用也请勿怪,不过配上总比不配要强点。

  1. 常用commands
  • start
uwsgi --ini uwsgi.ini
nginx -c /home/lhuang/01Git/kiwi_dev/nginx/nginx.conf
  • stop
 nginx -s stop
  • restart
    如果修改了代码,他是不会直接生效的,必须重启uwsgi和nginx服务,先说uwsgi
    这个工具本身自带stop命令,但是确实没什么用,所以直接点,直接找到进程号,kill掉就好了.
killall -9 uwsgi

如果没有killall命令,就直接用ps搜出来kill吧

ps -ef | grep uwsgi
kill -9 PID

再来说nginx,这个命令提供了reload,用于重载,亲测也没什么用,所以直接stop再重新开始吧

nginx -s stop
nginx -c /home/lhuang/01Git/kiwi_dev/nginx/nginx.conf

相关文章

网友评论

      本文标题:用uWSGI+django+nginx部署django

      本文链接:https://www.haomeiwen.com/subject/ohcwshtx.html