所在位置:

centos环境下通过nginx和uwsgi搭建django网站

我用 nginx + uwsgi + centos 部署 django 项目的时候遇到了一些问题,在这里做一些分享和总结,希望对大家有帮助

nginx + uwsgi + django 的实现原理

  • uwsgi 是一个 web 服务器,它实现了 wsgi、uwsgi、http等协议
  • nginx 的作用很多,这里只讲我们用到的反向代理和动静分离,其它功能后面会详细说
    • nginx 的反向代理简单来说就是相当于中介或者实现转发的功能
    • nginx 的动静分离处理就是 nginx 只处理前端客户端的静态文件或者图片等等、而后端就由其它服务器来处理
  • django 就是一个 python 的 web 应用框架
  • 简单的总结:client <----> nginx <----> uWSGI <-----> Django
    • 客户端发送请求到 nginx,如果是前端静态文件,nginx 自己处理完返回
    • 如果是后端的数据处理,就交由 uwsgi 调用 django 来处理,并返回数据给 nginx,再由 nginx 返回给客户端
  • 部署的步骤可以分为以下几步
    • 先测试 nignx 服务器是否成功
    • 再测试 uwsgi 是否可以运行 python 文件
    • 然后测试 uwsgi 是否可以运行 django 项目文件
    • 最后,测试 uwsgi 是否可以连接 nginx 服务器

系统所需要软件的基本信息

操作系统 : centos 7

uwsgi : 2.0.13.1 (64bit)

django : 1.8.2

nginx : 1.10.1

前提工作

更新系统
$ sudo yum update
$ sudo yum -y install gcc
安装 mysql
$ sudo yum -y install mariadb-server mariadb-devel mariadb
$ sudo systemctl start mariadb.service
$ sudo systemctl enable mariadb.service
修改 mysql 密码
$ sudo /usr/bin/mysqladmin -u root password '修改的密码'
创建 mysql 的数据库,名叫 mydatabase
$ sudo mysql -u root -p
mysql > CREATE DATABASE mydatabase DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
安装 pip 和 virtualenv
$ sudo yum -y install python-setuptool
$ sudo easy_install pip
$ sudo easy_install virtualenv
安装 PIL 库
$ cd /usr/local/src/
$ wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
$ tar -zxvf Imaging-1.1.7.tar.gz
$ Imaging-1.1.7
$ sudo python setup.py build_ext -i
$ sudo python setup.py build
$ sudo python setup.py install

安装和测试 nginx

安装 nginx
$ cd /usr/local/src
$ wget http://nginx.org/download/nginx-1.10.1.tar.gz
$ tar -zxvf nginx-1.10.1

$ sudo ./configure --prefix=/usr/local/nginx-1.10.1 \
> --with-http_stub_status_module  \
> --with- http_gzip_static_module

$ sudo make && make install
启动 nginx
$ /usr/local/nginx/nginx-1.10.1/sbin/nginx

打开浏览器,输入 http://localhost/,应该可以看到 Welcome to Nginx!

安装和测试 uwsgi

安装 uwsgi
$ pip install uwsgi
测试 uwsgi 的代理功能,在 home 目录下建立一个 test.py 文件,内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

运行 test.py 文件

$ uwsgi --http :8000 --wsgi-file test.py

在浏览器中访问,http://localhost:8000/, 如果出现 Hello World ,则说明uwsgi代理正常工作

测试 uwsgi 是否可以运行 django 项目文件
$ cd /var/www/

$ virtualenv env
$ source env/bin/active

$ pip install Django===1.8.2

$ django-admin.py startproject mysite 

# 启动命令
$ uwsgi --http :8000 --home /var/www/env --chdir /var/www/mysite/ --module mysite.wsgi

在浏览器中访问,http://localhost:8000, 如果出现 It Work! ,则说明uwsgi + django 正常工作

注意:如果出现 400(Bad Request)的错误, 配置一下 settings.py 里的选项

DEBUG = False
ALLOWED_HOSTS = [
    'localhost',
];

测试 uwsgi + django + nginx

nginx 的 nginx.conf 配置内容如下 (nginx 的配置文件在 /usr/local/nginx-1.10.1/nginx/conf 目录下)
orker_processes  4;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;

    keepalive_timeout  65;
    gzip on;
    gzip_min_length 200;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 3;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/xml+rss application/json;
    gzip_vary on;

    upstream myblog {
        server unix:///var/www/mysite/blog.sock;
    }

    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        location /media {
            alias /var/www/mysite/media;
        }

        location /static {
            alias /var/www/mysite/static;
        }

        location / {
            include uwsgi_params;
            uwsgi_pass myblog;
        }
    }
}
uwsgi + django 的配置
$ cd /var/www/

$ virtualenv env
$ source env/bin/active

$ pip install Django===1.8.2

$ django-admin.py startproject mysite 
$ mkdir static media

# 启动命令
$ uwsgi --socket /var/www/mysite/blog.sock --home /var/www/env --chdir /var/www/mysite/  --master --processes 4 --module mysite.wsgi --chmod-socket=666
重启 nginx
$ /usr/local/nginx-1.10.1/sbin/nginx -s reload
访问 http://localhost/,出现 It Work,说明已经成功了, 如果出现 502,应该是 uwsgi 服务没有启动
把上面的 uwsgi 命令行的内容转换为 ini 文件,内容如下
uwsgi.ini file
[uwsgi]

chdir      = /var/www/mysite

wsgi-file   = /var/www/mysite/wsgi.py

home        = /var/www/env

daemonize   = /var/www/mysite/mysite.log

master      = true
pidfile     = /var/www/mysite/site_master.pid

processes    = 4

socket       = /var/www/mysite/blog.sock

chmod-socket = 666

vacuum       = true
vhost = true
touch-reload = /var/www/mysite/reload
启动 uwsgi 的命令
# 启动 uwsgi
$ uwsgi --ini /var/www/mysite/uwsgi.ini &

# 重启 uwsgi
$ uwsgi --reload /var/www/myiste/site_master.pid

# 停止 uwsgi
$ uwsgi --reload /var/www/myiste/site_master.pid
注意: site_master.pid 的值一定要跟 nginx/logs 目录下 nginx.pid 的值一致,不然会报错

【上一篇】没有上一篇文章了

【下一篇】ArchLinux常用软件

相关文章