基于docker+jenkins+git构建ci/cd(2)之nginx镜像和uwisg的设置
WSGI
WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范。server和application的规范在PEP3333中有具体描述,要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
uWSGI
uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。
uwsgi
与WSGI一样,是uWSGI服务器的独占通信协议,用于定义传输信息的类型(type of information)。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
Nginx
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能
正向代理器VS反向代理器
正向代理器
正向代理器是一个位于使用者端以及目标服务器之间的代理服务器(代理服务器),
透过代理伺服器收发Request / Respond资料,
如上图,X无法直接和Z请求资料,但是Y可以和Z请求资料(于是X透过Y向Z请求资料),
Y得到资料后,再将资料回传给X,这样X就能顺利得到Z的资料了。
通常正向代理器必须额外做一些设定才可以使用。
正向代理器,Client和Proxy可视为同一个LAN,对服务器是隐藏的。
温馨小提醒 ❤️
-
LAN(局域网),又称区域网路
-
WAN(广域网),又称广域网路
-
WLAN(无线局域网),又称无线区域网路
正向代理器是代理使用者端(Client端),替使用者端(Client端)收发请求/响应,
让真正的使用者对伺服器端(Server端)隐藏。
可能你自己也有使用过(或正在使用 😁)正向代理器,只是你不知道而以,像最常见的就是FQ(VPN) 😏
今天主角是阿鬼,阿鬼无法浏览FB,但可以浏览服务器A,而阿鬼发现服务器A可以访问FB,
于是阿鬼就透过Server A去浏览FB,整个流程是,阿鬼透过服务器A去浏览FB,服务器A收到
来自阿鬼的请求时,去浏览FB,FB再把响应回传给服务器A,服务器A再把收到的
回复回传给阿鬼,这样阿鬼就能顺利得到FB的资料,这就是透过Proxy(正向代理器)。
反向代理器
反向代理器则相反过来,对于使用者端来说,反向代理器就好像是目标Server,
使用者端也不需要做额外的设定,
如上图,虽然整个流程还是X-> Y-> Z,但因为不用特别设定,所以使用者端会感觉好像直接是X-> Z,
反向代理器,Proxy和Server属于一个LAN,对客户端隐藏
反向代理器是代理伺服器端(Server端),替伺服器端(Server端)收发请求/响应,
让真正的伺服器(Server端)对使用者隐藏。
访问过程
通过docker 构建nginx镜像
FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf COPY my_nginx.conf /etc/nginx/sites-available/ RUN mkdir -p /etc/nginx/sites-enabled/\ && ln -s /etc/nginx/sites-available/my_nginx.conf /etc/nginx/sites-enabled/ # RUN mkdir -p /etc/nginx/sites-enabled/\ # && ln -s /etc/nginx/sites-available/my_nginx.conf /etc/nginx/sites-enabled/\ # && rm /etc/nginx/conf.d/default.conf CMD ["nginx", "-g", "daemon off;"]
自己的nginx的配置文件my_nginx.conf内容:
upstream uwisg { #server 127.0.0.1:8001; # use TCP server unix:/docker_api/bbs.sock; # for a file socket } # configuration of the server server { # the port your site will be served on listen 8000; # index index.html; # the domain name it will serve for # substitute your machine's IP address or FQDN # server_name .example.com; charset utf-8; client_max_body_size 75M; # adjust to taste # Django media # location /media { # alias /docker_api/media; # your Django project's media files - amend as required # } location /static { alias /docker_api/static; # your Django project's static files - amend as required } location / { uwsgi_pass uwisg; uwsgi_read_timeout 600; uwsgi_send_timeout 600; uwsgi_connect_timeout 600; include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed } }
以及nginx的一些基础设置配置。最重要的是告诉nginx去哪里找我们的配置文件:
user root; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/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"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; # include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-available/*;
关于uwsgi.ini的设计:
[uwsgi] socket = bbs.sock http = :9000 master=true # maximum number of worker processes processes=4 threads=2 # Django's wsgi file module=bbs.wsgi:application max-requests=5000 # chmod-socket=664 # uid=www-data # gid=www-data # clear environment on exit
关于uwsgi和nginx的相关配置可以查看https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html这个教学文档,其中有nginx和uwsgi的相关配置
关于django的Dockerfile设计:
FROM python:3.6.2 ENV PYTHONUNBUFFERED 1 RUN mkdir /docker_api WORKDIR /docker_api COPY . /docker_api #RUN pip install -r requirements.txt RUN pip install -i https://pypi.python.org/simple/ -r requirement.txt
还有一篇关于这两个容器的docker-compose.yaml的内容:
version: '3' services: nginx: container_name: nginx-container build: ./nginx restart: always ports: - "8000:8000" volumes: - api_data:/docker_api - ./log:/var/log/nginx depends_on: - django django: container_name: django-container build: ./ restart: always # command: uwsgi --emperor uwsgi.ini command: uwsgi --ini uwsgi.ini ports: - "8001:8001" - "9000:9000" volumes: - api_data:/docker_api volumes: api_data
在jenkins构建中执行相应的shell脚本或者命令通过编译最新的代码添加至django镜像中,并将镜像推到自己私有仓库或者阿里云镜像仓库或者自己搭建一个harbor
#私有仓库地址 REG_URL=xxx #$WORKSPACE分配给构建作为工作空间的目录的绝对路径。 #根据时间生成版本号 TAG=$REG_URL/$JOB_NAME cd $WORKSPACE/ #使用我们刚才写好的 放在项目下面的Dockerfile 文件打包 # sudo docker login --username=xxxx -p=xxxx registry.cn-hangzhou.aliyuncs.com sudo docker build -t $JOB_NAME $WORKSPACE/. sudo docker tag $JOB_NAME $TAG sudo docker push $TAG sudo docker rmi $TAG