上线布署是一件比较复杂的事,要做安全高速不浪费资源不比写一个APP式网站简单,本例在编程阶段采用的是Django 和SQLite数据库,SQLite在编程测试时应用是很方便的,但在正式项目中往往不会采用。对于较大项目往往有多个环境,编写时的本机环境,上线前的测试环境,以及正式应用环境。需要在Django代码的settings中做相应配置。所以Docker的优势就出来了,我们只需要让测试环境和正式环境一样就方便多了。这里省略了settings的配置过程(正式项目代码就不贴了)。
原创文章,版权所有。未经许可,严禁转载。
项目简单布署
pull下来的系统已带Python3.6,就不用安装了。start容器(如图)后,在DOCKER内无需sudo ,国外源慢就换源vim /etc/apt/sources.list
:
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
1.apt update
2.apt upgrade
3.上传项目文件到容器内:
docker cp abc {容器ID}:/home/
4.批量安装django等依赖库,可以在本地项目内用pip3 freeze > plist.txt
导出,也可以找到requirements.txt文件来安装。这个版本Python自带pip3(编译版本好像都自带)。
pip3 install -r plist.txt
5.进入上传文件目录测试一下:
python3 manage.py runserver 0:8880
6.现在可以启动浏览器输入docker容器的IP测试一下,浏览器可能会提示出错。因为没有配置Django的接受IP。不过只要有反应就表示正常了。如图:
7.修改上传项目内的settings文件,ALLOWED_HOSTS = ['*']
。现在就可以正常访问了,不过还是使用了Django做服务器。
8.安装uwsgi,本映像自带一个,好像有点问题,用uwsgi --plugins-list竟然找不到插件,所以我删除重装了pip3 install uwsgi
,如果没有编译器就装一下apt install build-essential
9.可以通过命令来试一下 uwsgi工作是否正常,浏览器能正常显示网站。
uwsgi --http :8000 --wsgi-file abc/wsgi.py
测试是否正常,发现有些依赖没装(写代码时直接复制进项目环境内的),补上后一切正常。
apt install rabbitmq-server
rabbitmq-server # 启动rabbitmq-server
celery -A abc worker -l info # 启动celery
10.这种运行方式显然不科学,给uwsgi写个配置文件,就写在abc根目录下vim uwsgi.ini
,配置成 sock方式:
[uwsgi]
# configuration
master = true # 主进程
chdir = /home/abc # 工作目录
module = abc.wsgi:application # 模型APP
wsgi-file = /home/abc/wsgi.py # Django的wsgi
# plugin = python # 已有
socket = /home/abc/abc.sock # sock 文件
processes = 4
threads = 2
buffer-size = 65535
pidfile = /tmp/abc-master.pid # 使用uwsgi --stop(reload) /tmp/abc-master.pid
uid = 1000
chmod-socket = 666 # 改变权限,可能664也行
daemonize = /home/abc/uwsgi.log
11.如上配置是不能直接使用的。需要Nginx代理才行:
apt install nginx # 安装
# nginx.conf # 编辑配置
# the upstream component nginx needs to connect to
upstream abc { # 建立abc的upstream,指定uwsgi名称,与上面配置同名sockserver unix:///home/abc/abc.sock;# server 127.0.0.1:8880; # 测试}
# configuration of the server
server { # 服务器配置listen 80;server_name www.abc.com abc.com;charset utf-8;# max upload sizeclient_max_body_size 75M;# django medialocation /media { # 媒体文件,注意路径# /home/abc/media;alias /home/abc/media;}location /static { # 静态文件alias /home/abc/static;}location / { # 注意uwsgi_params文件路径,将/下的URL转发给upstream即uwsgi的sockinclude /home/abc/uwsgi_params; uwsgi_pass abc;}}
建立一个链接ln -s /home/abc/nginx.conf /etc/nginx/sites-enabled/abc.conf
11.如上配置应该就能通过域名打开网站了,本地测试注意域名服务,可配置HOSTS来做类似DNS。静态文件可能不加载,需要收集一下。编辑 settings文件,添加
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
顺便更改下:
DEBUG = False
ALLOW_HOST = ['abc.com', 'www.abc.com']
python3 manage.py collectstatic
12.停止docker重新启动后运行rabbitmq、celery、uwsgi、nginx如下:
13.测试后session 存取有问题,要改SESSION_ENGINE的配置,完成后如图:
14.下一步还要将数据库换成mysql或postgresql,自带的SQLite效率太低,访问量不大倒也可以,还省资源。还可以再单独做一个nginx代理服务,以便为多个站服务。节约IP资源。现在很多浏览器对http不友好,上线还应该改成https…待续