这里就是很基本的运行django框架,没有用到其他的附加服务,参考文章里很全,其实看他的就行了,只是记录下我自己的部署流程
参考博客:https://blog.youkuaiyun.com/hbnn111/article/details/77176629
- Xshell连接到Ubuntu服务器
- 在文件夹下git clone Django项目(我的项目名是weixin_test,用于写一些封装微信接口方法)
- 目录结构:
├── weixin_test
│ ├──weixin_test
│ ├── mydecoration
│ ├── utils
│ ├── venv
│ └── static
│ ├── weixin
│ ├── manage.py
│ ├── Dockerfile
│ ├── gunicorn.conf
│ ├── requirements.txt
│ ├── start.sh
├── docker-compose.yml
└── nginx
├── Dockerfile
4.weixin_test下的 Dockerfile(用于放项目需要引用的镜像环境,运行需要的安装包,环境变量,工作路径设置;需要的python包则放在requirements.txt里):
FROM ubuntu:16.04
RUN apt-get -y update
RUN apt-get install -y python3.5
RUN apt-get install -y build-essential libssl-dev libffi-dev python3-dev
RUN apt-get -y update
RUN apt-get install -y python3-pip
ENV TIME_ZONE=Asia/Shanghai CODE_DIR=/code
ENV SPIDER=/weixin_test
RUN mkdir /weixin_test
WORKDIR /weixin_test
ADD . /weixin_test
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
RUN pip3 install -r requirements.txt
COPY requirements.txt /tmp/requirements.txt
VOLUME $CODE_DIR
EXPOSE 80 8080 8000 5000
5.weixin_test下的 gunicorn.conf :
workers=4
bind=['0.0.0.0:8080']
proc_name='weixin_test'
pidfile='/tmp/weixin_test.pid'
worker_class='gevent'
max_requests=6000
6.weixin_test下的 requirements.txt :
asn1crypto==0.24.0
bcrypt==3.1.4
Cerberus==1.2
cffi==1.11.5
cryptography==2.2.2
Cython==0.28.4
falcon==1.4.1
gevent==1.3.5
greenlet==0.4.13
gunicorn==19.9.0
idna==2.7
itsdangerous==0.24
pycparser==2.18
PyMySQL==0.9.2
python-mimeparse==1.6.0
shortuuid==0.5.0
six==1.11.0
SQLAlchemy==1.2.10
ujson==1.35
oss2==2.6.1
Django==2.1
7.weixin_test下的 start.sh :
#!/bin/bash
#命令只执行最后一个,所以用 &&
python3 manage.py collectstatic --noinput &&
python3 manage.py migrate &&
gunicorn weixin_test.wsgi:application -c gunicorn.conf
8.weixin_test下,weixin_test/settings.py设置 :
ALLOWED_HOSTS = ['*']
STATIC_ROOT = os.path.join(BASE_DIR,'static')
如果数据库有另外使用的,就配置数据库
9 . 根目录下的docker-compose.yml (参考链接里很全,这里我只需要用到web):
version: "3"
services:
web:
build: ./weixin_test
ports:
- "8524:8080"
volumes:
- ./weixin_test:/weixin_test
- /tmp/logs:/tmp
command: bash start.sh
restart: always
- build 根据Dockerfile重新build一个镜像;
- ports 格式为 在主机映射时设定的端口:容器内项目运行对外暴露的端口。相当于一个nat转换,设置内部的端口向外转发的端口;
- volumes 同样是设置数据文件备份,也可以说成是同步,web容器的工作目录/weixin_test备份到主机上的目录;
- command 启动容器时执行的文件;
- links(我没用到redis等,就没写) 创建和其他容器中的service的链接,指定服务名字即可。有了这个连接,服务之间就可以通过service名字通信了,在前面nginx配置中的proxy_pass就用了web服务;
- depends_on(我没用到db,就没写) 它有两层含义,一是在启动服务的时候,会先启动db,然后再启动web;二是如果执行ocker-compose up web也会创建和启动db
10 nginx目录下的Dockerfile :
FROM nginx
#对外暴露端口
EXPOSE 80 8000 8080
11 nginx配置
我这里用的是安装在ubuntu的nginx,参考文里用的是nginx镜像
nginx配置具体看上一篇文章 https://blog.youkuaiyun.com/qq_35567179/article/details/91040820
切到nginx/conf/vhost/下的project_nginx.conf(自己命名的)
server {
listen 80;
server_name 域名;
location / {
#rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记
#这样就可以多个项目共用1个域名,只需要用不同的端口号区分项目进行访问
rewrite ^ https://$server_name$request_uri? permanent;
}
}
server {
server_name 域名;
charset utf-8;
#默认访问该域名时直接跳转到的html
location = / {
rewrite ^/(.*) /test/index.html redirect;
}
#weixin test
location /weixin_test{
rewrite /weixin_test/(.*) /$1 break;
proxy_pass http://127.0.0.1:8524;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
访问
www.域名.com/weixin_test/ ,跳转到项目的默认页面