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,命令行参数格式:--

  • 常用选项:
    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

posted @ 2018-02-02 17:30  归来似少年  阅读(279)  评论(0编辑  收藏  举报