Nginx + uwsgi + django安装部署

一、django安装配置

django的安装需要Python环境,python的安装就不介绍了,网上一搜一大把。

python环境安装好之后,就可以开始安装django,直接运行如下命令即可:

[root@localhost proxy]# pip install Django==1.11.9
[root@localhost proxy]# python
Python 3.6.2 (default, Jan 22 2018, 15:50:54) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 11, 9, 'final', 0)
>>> 

可以看到目前安装的是1.11.9版本的django

一般在django使用过程中,建议使用虚拟环境来运行,这样可以在一台服务器上运行不同版本的django

django的虚拟环境安装配置如下

首先,我们用pip安装virtualenv:

$ pip install virtualenv

安装之后,就可以创建一个独立的Python运行环境,

在/usr/local/webapp中创建一个mysite目录
[root@localhost mysite]# pwd
/usr/local/webapp/mysite
执行 virtualenv 命令生成myenv虚拟目录
[root@localhost mysite]# virtualenv --no-site-packages myenv

就可以创建一个独立的Python运行环境,我们还加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境。

新建的Python环境被放到当前目录下的myenv目录。有了myenv这个Python环境,可以用source进入该环境:

[root@localhost mysite]# pwd
/usr/local/webapp/mysite
[root@localhost mysite]# ls
myenv
[root@localhost mysite]# source myenv/bin/activate          通过此命令既可进入到虚拟环境
(myenv) [root@localhost mysite]# 
(myenv) [root@localhost mysite]# deactivate                     通过此命令既可退出虚拟环境

在虚拟环境中可以再次安装django包,这样这个独立的django虚拟环境就产生了

virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。

配置django

在虚拟环境中,安装配置django:

(myenv) [root@localhost mysite]# django-admin startproject newproject   创建一个django项目,在newproject文件夹中,修改settings.py中的参数ALLOWED_HOSTS = ['*']
myenv) [root@localhost newproject]# python manage.py runserver 0.0.0.0:8000     运行django

此时访问IP加端口形式就可以看到django的欢迎页面

二、uwsgi安装配置

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器,uWSGI代码完全用C编写

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI是一种通信协议。
  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

    uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

    uwsgi的安装也很简单,直接使用pip安装即可:

pip install uwsgi
uwsgi --version    # 查看 uwsgi 版本

测试 uwsgi 是否正常:

新建 test.py 文件,内容如下:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

然后在终端运行:

uwsgi --http :8001 --wsgi-file test.py

在浏览器内输入:http://127.0.0.1:8001,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。

以上只是最简单的一个安装启动测试过程,要使其能够更好的工作,需要配置uwsgi的配置文件:

  • uwsgi.ini 配置示例:

    [uwsgi]

    socket = 127.0.0.1:8000

    workers = 4

uwsgi 选项说明:

  • 选项的格式:

    1,命令行参数格式:--

    2,配置格式(以ini为例):option = xxxx

  • 常用选项:

    socket : 地址和端口号,例如:socket = 127.0.0.1:50000

    processes : 开启的进程数量

    workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)

    chdir : 指定运行目录(chdir to specified directory before apps loading)

    wsgi-file : 载入wsgi-file(load .wsgi file)

    stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

    threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

    master : 允许主进程存在(enable master process)

    daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

    pidfile : 指定pid文件的位置,记录主进程的pid号。

    vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

    disable-logging : 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录:

    [pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)

  • 其他选项说明:

    其他选项,具体可以通过 --help 选项来查看:

    uwsgi --help

项目中的配置文件

(myenv) [root@localhost newproject]# pwd
/usr/local/webapp/mysite/newproject
(myenv) [root@localhost newproject]# ls
db.sqlite3  manage.py  newproject  uwsgi.ini
(myenv) [root@localhost newproject]#more uwsgi.ini
[uwsgi]
socket = 127.0.0.1:9090
chdir= /usr/local/webapp/mysite/newproject
nodule= newproject.wsgi
master = true         
processes= 2
threads= 2
max-requests= 2000
chmod-socket= 664
vacuum= true
daemonize = /usr/local/webapp/mysite/newproject/uwsgi.log
pidfile = /usr/local/webapp/mysite/newproject/uwsgi9090.pid

启动:uwsgi --ini uwsgi.ini

停止:uwsgi --stop uwsgi.pid

重启:uwsgi --reload uwsgi.pid

三、nginx安装配置

nginx的安装也就很简单了,网上也很多教程,这里就简单写下:

安装nginx需要如下的yum包
yum -y install gcc gcc-c++ autoconf automake
yum -y install zlib zlib-level openssl openssl-devel pcre pcre-devel popt popt-devel

创建nginx用户
groupadd nginx
useradd -g nginx nginx -s /sbin/nologin -M

在解压的nginx包中编译执行
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module 
--with-http_ssl_module

安装完nginx之后,就需要在nginx里进行配置:

server {
    listen 80;
    server_name localhost;
    charset     utf-8;
    #access_log      /wwwroot/destiny/nginx_access.log;
    #error_log       /wwwroot/destiny/nginx_error.log;
    client_max_body_size 75M;


    location /static {
        alias /usr/local/webapp/mysite/newproject/static/;
    }

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

此时启动nginx就可以看到django的欢迎页面了

其他注意事项:

静态文件一直都找不到的问题,现在终于可以解决了,所有的静态文件都会由nginx处理,不会将请求转到uwsgi

修改django项目的settings.py文件:

STATIC_ROOT='/usr/local/webapp/mysite/newproject/static/'

STATIC_URL='/static/'

在虚拟环境中运行如下命令,收集所有静态文件到static_root指定目录:

python manage.py collectstatic

重启nginx、uwsgi