本文介绍使用nginx+uwsgi+django+docker部署django项目的方法。其中nginx作为反向代理,uwsgi作为服务器,django作为应用程序,ES作为数据库。nginx部署于一个docker容器,uwsgi+django部署于一个docker容器(一般是多个备份),为提高效率,使用docker-composer完成多容器一键部署。服务架构如下图所示。
备注:反向代理名词解释,一般说到代理,都是正向代理。正向代理场景中,有多个客户端,一个服务器,代理做的事情是把客户端发送的请求转发到服务器,是对客户端做的代理;而反向代理中,恰恰相反,是对服务器做的代理,一般而言,有多个服务器(功能一样),当请求量很大时(比如秒杀),一个服务器可能扛不住,我们会部署多个服务器,反向代理做的事情,就是把发来的请求,均匀的分配给不同的服务器,缓解服务器压力,此即为反向代理。总结,正向代理是代理的客户端,反向代理是代理的服务器端。
目录结构如下图所示
部署共分为7步。
1. 基于待部署web项目SeeStar生成如上目录结构。
cd ~/Workspace
mkdir TestDocker
cp SeeStar/ TestDocker/
cd TestDocker
mkdir nginx
2. 完成web项目uwsgi配置,在SeeStar目录下新建uwsig.ini文件,并写入如下内容。
[uwsgi]
# Django-related settings
socket = :8080
#http = :8080
# the base directory (project full path)
chdir = /SeeStar
# Django s wsgi file
wsgi-file = /SeeStar/SeeStar/wsgi.py
master = true
processes = 4
chmod-socket = 664
vacuum = true
pidfile = pid.uwsgi
# run process background and save log to daemonize
# daemonize = UWSGI.log
备注:
a. uwsgi文件配置名字随便写(注意与下边dockerfile文件中对应),并且以.ini结尾。
b. 因使用nginx作为代理,nginx与uwsgi通信方式选socket,https不好用,原因待探查。
c. chdir、wsgi-file指向与项目目录对应。
3. 完成web项目Dockerfile配置,在SeeStar文件夹内新建Dockerfile文件,写入如下内容。
FROM python:3.6
MAINTAINER lichao18@staff.weibo.com
# 以下是重点,.的意思是把当前目录的所有文件(包含文件夹)copy到镜像/SeeStar中
COPY . /SeeStar
WORKDIR /SeeStar
RUN pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple
EXPOSE 80 8080
CMD ["uwsgi", "--ini", "uwsgi.ini"]
备注:
requirements.txt为项目运行依赖,一定包含uwsgi包(可通过pip install uwsgi安装)。
4. 完成nginx配置文件,在nginx文件夹中,新建nginx.conf文件,写入如下内容。
upstream see_star {
server 10.238.170.97:8080;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
location /static {
alias /usr/share/nginx/html/static;
}
location / {
uwsgi_pass see_star;
include /etc/nginx/uwsgi_params;
}
}
备注:
a. upstream配置负载均衡,可放置多个服务器,此仅放一个。
b. uwsgi_pass see_star指来了动态请求,交给上述配置的负载均衡处理。
c. uwsgi_params在/etc/nginx文件夹中有。
5. 完成nginx 服务Dockerfile配置,在nginx文件内,新建Dockerfile文件,写入如下内容。
FROM nginx
EXPOSE 80 8000
RUN rm /etc/nginx/conf.d/default.conf
ADD nginx.conf /etc/nginx/conf.d/
RUN mkdir -p /usr/share/nginx/html/static
备注:
EXPOSE 80 8000,仅仅是声明暴露这两个端口,实际端口映射,要在实例化镜像时使用-p指定。
6. 完成docker-compose文件编写,编排web容器、nginx容器,在根目录TestDocker文件夹中新建docker-compose.yml文件,写入如下内容。
version: "3"
services:
web:
build: ./SeeStar
ports:
- "8080:8080"
restart: always
nginx:
build: ./nginx
ports:
- "80:80"
links:
- web
depends_on:
- web
restart: always
备注:
a. services下的项要空两格。
b. link含义参考这篇博客 c. SeeStar、nginx分别为根目录下的两个文件夹。
最终项目目录结构参照开头项目截图。
7. 编排,执行。在TestDocker目录中执行如下命令。
docker-compose build
docker-compose up -d
最后,0.0.0.0:80访问部署成功项目。