[toc]
# Web应用部署
在我的阿里云主机部署Django之web项目,基本的部署架构是,Ngix -> uWSGI -> Django,安装和配置参考[Django Nginx+uwsgi 安装配置](http://www.runoob.com/django/django-nginx-uwsgi.html)和[Python uWSGI 安装配置](http://www.runoob.com/python3/python-uwsgi.html)。
* Nginx是Web服务器
* uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。[参考uWSGI、WSGI和uwsgi](https://www.cnblogs.com/wspblog/p/8575101.html)
* Django是WEB App框架
以下是Django项目的目录(PyCharm构建)
```
./MyDjangoProject
└───myapp
└───mysite
└───myusers
└───static
└───venv
│ db.sqlite3
│ manage.py
│ ...
```
以下是阿里云主机的相关目录
```
/root
└───downloads
│ │ ...
│
└───qb_web_prj
└───ex_nginx_conf # nginx的相关配置文件
└───ex_wsgi # uWSGI的相关文件
└───MyDjangoProject # 我的Django项目
└───qb_venv #虚拟环境venv
```
## Virtualenv(Python虚拟环境)
`virtualenv`is a tool to create isolated Python environments.virtualenv 是一个创建隔绝的Python环境的工具。[virtualenv安装使用简介](https://www.cnblogs.com/technologylife/p/6635631.html)
1. 安装virtualenv
```
apt install virtualenv
```
2. 创建一个虚拟环境
~~~
$ cd my_project_dir
$ virtualenv venv #venv为虚拟环境目录名,目录名自定义
$ virtualenv -p /usr/bin/python2.7 venv # -p参数指定Python解释器程序路径
~~~
2. 要开始使用虚拟环境,其需要被激活:
~~~
$ source venv/bin/activate
~~~
`从现在起,任何你使用pip安装的包将会放在 venv` 文件夹中,与全局安装的Python隔绝开。
像平常一样安装包,比如:
~~~
$ pip install requests
~~~
3. 如果你在虚拟环境中暂时完成了工作,则可以停用它:
~~~
$ . venv/bin/deactivate
~~~
这将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。
要删除一个虚拟环境,只需删除它的文件夹。(执行 `rm -rf venv` )。
这里virtualenv 有些不便,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,你可能会有很多个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。
* 安装virtualenv问题的处理
[# virtualenv setuptools pkg\_resources pip wheel failed with error code 2](https://blog.csdn.net/hymanjack/article/details/80341943)
## 在我的阿里云主机部署Django项目
0. 安装虚拟环境virtualenv,启动虚拟环境,在虚拟环境中安装Django
```
(qb_venv) root@xxxx:~:python --version
Python 3.5.2
```
### Django项目部署测试
1. 把PyCharm建立的django项目上传至阿里云主机
2. 用python manage.py runserver 0.0.0.0:9000命令运行django程序后,通过浏览器访问服务器网址的9000端口,出现访问错误,报错为
`Invalid HTTP_HOST header: ‘xxx.xx.xxx.xxx:9000’. You may need to add ‘xxx.xx’ to ALLOWED_HOSTS`。
解决办法是:修改django项目的setting.py文件
将`ALLOWED_HOSTS = []`改为`ALLOWED_HOSTS = ['*']`,
3. 运行我的django项目`python manage.py runserver 0.0.0.0:9000`
正常的话,在浏览器输入 **http://ip:9000**,可以看到自己页面。
### uWSGI安装测试
1. [Python uWSGI 安装配置](http://www.runoob.com/python3/python-uwsgi.html)
2. 按以上推荐的方法新建一个简单的web处理程序,然后启动http服务(
**uwsgi --http :9000 --wsgi-file foobar.py**)
正常的话,在浏览器输入 **http://ip:9000**,可以看到自己页面。
### Nginx WEB服务器安装测试
1. [阿里云Ubuntu 16.04系统下安装Nginx](https://www.jianshu.com/p/cee284a90c0e)
2. 启动Nginx,进入Nginx的安装目录,也就是刚才我们配置的`/usr/local/nginx`下的`sbin`目录下执行`./nginx`
3. Nginx端口默认端口为80,我们可以通过配置的IP或者域名进行访问,出现下图,说明Nginx启动成功,或者通过`ps -ref |grep nginx`查看Nginx的进程得知Nginx是否启动成功!
4. Nginx的配置文件为`/etc/nginx/nginx.conf`
5. Nginx的常用命令
* 关闭命令:`./nginx -s stop`
* 退出命令:`./nginx -s quit`,等程序执行完毕后关闭,建议使用此命令。
* 动态加载配置文件`./nginx -s reload`可以不关闭Nginx的情况下更新配置文件,非常好用!
* 查看Nginx版本:`./nginx -v`
### 部署Django项目@Nginx
Django,uWSGI,Nginx分别安装测试OK,下面就配置相关文件
1. 配置uwsgi的ini文件
我这里的uwsgi配置文件qbuwsgi.ini
```
[uwsgi]
# 对外提供 http 服务的端口
# http = :9000
#the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口
#socket=/data/wwwroot/DevOps/uwsgi/uwsgi.sock
socket = 127.0.0.1:9008
# the base directory (full path) django 程序的主目录
chdir=/root/qb_web_prj/MyDjangoProject
# Django's wsgi file
#module=mysite.wsgi:application
wsgi-file = mysite/wsgi.py
# maximum number of worker processes
processes = 4
#thread numbers startched in each worker process
threads = 2
#monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
stats = 127.0.0.1:9191
# clear environment on exit
vacuum = true
# 后台运行,并输出日志
daemonize = /var/log/uwsgi.log
# 在定义的文件夹内创建uwsgi.pid(该pid文件保存了uwsgi的进程号,用来重启和停止uwsgi服务)和uwsgi.status(用来查看uwsgi的服务状态)
# stats = %(chdir)/uwsgi/uwsgi.status # 注意这里用的是相对地址,以下定义的是绝对地址
stats = /root/qb_web_prj/ex_wsgi/uwsgi.status
pidfile = /root/qb_web_prj/ex_wsgi/uwsgi.pid
```
2. 启动uwsgi
uwsgi --ini qbuwsgi.ini,这样就启动了uwsgi
如何启动停止uwsgi参考[uwsgi服务启动(start)停止(stop)重新装载(reload)](https://blog.51cto.com/12482328/2087535)
* `uwsgi --ini qbuwsgin.ini` # 启动
* `uwsgi --reload 路径/uwsgi.pid` # 重启
* `uwsgi --connect-and-read 路径/uwsgi.status` # 查看运行状态
* `uwsgi --stop uwsgi/uwsgi.pid` #停止
* `ps aux | grep uwsgi` # 查看uwsgi的进程
3. 新建nginx配置文件
nginx的配置文件是`/etc/nginx/nginx.conf`,配置文件nginx.conf摘要如下:
```
http {
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
```
注意到该配置文件包含了/etc/nginx/sites-enabled/下的相关文件,把自己的相关配置文件放这里就好,这里我是这么处理的:新建文件/root/qb_web_prj/ex_nginx_conf/qb-django-nginx.conf,
然后把该文件软连接至/etc/nginx/sites-enabled/,qb-django-nginx.conf内容如下:
```
server {
listen 9007;
#web服务对外端口地址,即http访问端口号
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9008;
#对应uwsgi的输入端口号
uwsgi_param UWSGI_SCRIPT mysite.wsgi;
uwsgi_param UWSGI_CHDIR /root/qb_web_prj/MyDjangoProject/mysite;
index index.html index.htm;
client_max_body_size 35m;
}
}
```
4. 启动nginx
uwsgi已经启动了,nginx的配置文件也已经准备就绪,现在就可以启动nginx了:
输入命令`nginx`即可
nginx的常用命令如下:
* nginx -t # 启动 Nginx
* nginx -t # 检查配置文件nginx.conf的正确性命令
* nginx -s reload # 重新载入配置文件
* nginx -s reopen # 重启 Nginx
* nginx -s stop # 停止 Nginx
5. 浏览器查看结果
在浏览器输入http://xxx.xxx.xxx.xxx:9007就能看到django项目的展示!
大概流程是这样的:
1. 浏览器向http://xxx.xxx.xxx.xxx:9007发送请求;
2. nginx web服务器在端口号9007收到请求后,把请求通过socket = 127.0.0.1:9008
转发给了uwsgi服务端;
3. uwsgi服务端与django项目交互后再把结果原路反馈给浏览器,用户就可以在浏览器看到结果了!!!