所在位置:
- 首页
- 正文
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常用软件
相关文章