目录
最初的最初
工作环境:Ubuntu20.04
配置本地开发环境
安装基本工具
sudo apt-get update
sudo apt-get upgrade
sudo apt install vim curl
sudo apt install python3-pip
Django
sudo python3 -m pip install django # 安装
sudo django-admin --version # 查看版本
测试
sudo django-admin startproject HelloWorld # 建立项目
cd HelloWorld
sudo python3 manage.py migrate # 迁移数据
sudo python3 manage.py runserver 0.0.0.0:80 # 启动项目
# 浏览器访问127.0.0.1,显示欢迎接页面。
# ctrl+c结束。
uwsgi
sudo apt-get install uwsgi # 安装
sudo uwsgi --version # 查看版本
sudo apt-get install -y uwsgi-plugin-python3 # 安装插件
测试
sudo vim mytest.py # 编写文件内容
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
sudo uwsgi --http-socket 127.0.0.1:80 --plugin python3 --wsgi-file mytest.py # 启动
# 浏览器访问127.0.0.1,显示Hello World。
# ctrl+c结束。
为联测准备账号和文件权限
给当前用户授予管理员权限
sudo passwd root # 设置root密码
su root # 切换到root用户
vim /etc/sudoers # 修改文件,提升用户权限
<user> ALL=(ALL:ALL) ALL # <user>表示当前用户
# :wq!强制保存退出
# exit退出超级用户
为uwsgi准备账户
su root # 切换到超级用户
groupadd www # 添加用户组
useradd -g www www # 添加用户
passwd www # 添加密码
usermod -s /sbin/nologin www # 禁止www登录
usermod -G www root # 将管理员加入用户组
usermod -G www <user> # <user>表示当前用户
id www #检查成果
设置文件权限
chown -R www:www HelloWorld # 修改文件所有者
chmod -R 777 HelloWold # 修改文件权限
# 说明:x=1,w=2,r=4,x+w+r=7
# 751:自己7,同组5,其它1
联测 wsgi+django
# 使用测试Django时生成的HelloWorld项目。
sudo vim HelloWorld/settings.py # 修改文件
ALLOWED_HOSTS = ["*"] # “*”表示允许任何地址访问
DEBUG = True # 生产环境改为False
sudo vim uwsgi.ini # 编写文件
[uwsgi]
uid = www # uwsgi以此用户身份运行
gid = www # 用户组
http-socket = 0:8080 # 非root用户不能使用80端口
chdir = /path/to/HelloWorld # 项目路径
wsgi-file = HelloWorld/wsgi.py # 入口文件,此HelloWorld是项目路径下的子目录
master = True # 是否开启主进程
processes = 1 # 进程数量
threads = 2 # 线程数量
vacuum = True # 退出时删是否除pid文件
pidfile = uwsgi.pid # 记录pid
daemonize = uwsgi.log # 记录日志
plugin = python3 # 插件
sudo uwsgi --ini uwsgi.ini # 启动
# 浏览器访问127.0.0.1:8080,显示欢迎接页面。
sudo uwsgi --stop uwsgi.pid # 停止
联测通过以后,使用 python3 -m pip install 安装项目所需的python包,进行具体项目的开发工作。
配置docker发布环境
安装docker软件
curl -sSL https://get.docker.com/ | sh # 安装docker
sudo usermod -aG docker <user> # 设置允许启动docker的用户
reboot # 重启
sudo service docker start # 启动docker
sudo vim /etc/docker/daemon.json # 编写文件,设置国内镜像源
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
sudo service docker restart # 重启docker
docker pull ubuntu:20.04 # 拉取镜像
安装语言(非必须)
Docker的Ubuntu镜像自带C.UTF-8,其他语言需另外安装。
语言的安装可以用Dockefile或者在容器运行时通过命令安装。
但是,语言的指定只能在创建镜像时通过Dockerfile指定。
语言一经安装无法移除(localepurge不工作)。
# 本段不以docker开头的命令,都在docker内执行
docker run -itd --name=ubuntu ubuntu:20.04 /bin/bash
docker attach ubuntu
apt-get update
docker commit ubuntu ubuntu-update
apt install locales locales-all
docker commit ubuntu ubuntu-locales
docker stop ubuntu
docker rm ubuntu
设置语言
vim Dockefile # 编写Dockerfile文件
FROM ubuntu-update # 源镜像
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
docker build . # 构建
docker tag <id> ubuntu-utf8 # 修改标签,<id>是上一步生成的镜像image id
在docker内配置发布环境
docker run -itd --expose=80 --expose=8080 --name=ubuntu ubuntu-utf8 /bin/bash # 运行镜像
docker attach ubuntu # 进入容器
apt install vim
apt install python3
apt install python3-pip
python3 -m pip install django # 安装django
django-admin --version # 查看版本
apt-get install uwsgi # 安装uwsgi
uwsgi --version # 查看版本
apt-get install uwsgi-plugin-python3 # 安装插件
groupadd www # 添加用户组
useradd -g www www # 添加用户
passwd www # 设置密码
usermod -s /sbin/nologin www # 禁止登录
usermod -G www root # 把root添加进www
id www # 验证结果
# 按照本地开发环境的测试方法,进行测试和联测,从宿主机访问docker容器进行验证。
# 测试时,暴露地址应为0.0.0.0。
# 联测时要访问8080端口。
docker stop ubuntu # 停止容器
docker commit ubuntu ubuntu-uwsgi # 提交容器到镜像
docker rm ubuntu # 移除容器
项目的发布
docker run -itd --expose=80 --expose=8080 --name=ubuntu ubuntu-uwsgi /bin/bash # 运行镜像
docker attach ubuntu # 进入容器
# 使用 python3 -m pip install 安装项目所需的python包。
# 部署项目,按联测的方式启动,从宿主机访问docker容器进行验证。
docker stop ubuntu # 停止容器
docker commit ubuntu ubuntu-calc # 提交容器到镜像
docker rm ubuntu # 移除容器
docker save -o ./calc.tar ubuntu-calc # 保存镜像到文件,该文件交付生产。
使用Nginx进行反向代理
启动一个docker容器,下文的两种代理都使用这个容器。
docker run -itd --expose=80 --expose=443 --name=ubuntu ubuntu-update /bin/bash # 启动容器
docker attach ubuntu # 进入容器
apt install nginx # 安装nginx
service nginx start # 启动nginx
简单的反向代理
vim /etc/nginx/sites-available/my_nginx.conf # 编写文件,配置反向代理
# ——————————————文件开始————————————————
# 要被代理的 web 服务器
pstream calc {
server 172.17.0.3:8080;
}
# 监听端口
server {
listen 80;
server_name 172.17.0.2;
charset utf-8;
client_max_body_size 75M;
location / {
proxy_pass http://calc;
}
}
# —————————————文件结束—————————————————
ln -s /etc/nginx/sites-available/my_nginx.conf /etc/nginx/sites-enabled # 建立软连接
service nginx reload # 重新加载服务
# 访问172.17.0.2,验证成功。
带ssl的反向代理
生产环境的ssl文件由相关公司颁发。
开发环境的ssl可自行制作,此处从略。
vim /etc/nginx/sites-available/my_nginx.conf # 修改文件,添加如下内容
server {
listen 443;
server_name 172.17.0.2;
charset utf-8;
client_max_body_size 75M;
ssl on;
ssl_certificate cert/calc.aisheji.tech.pem;
ssl_certificate_key cert/calc.aisheji.tech.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://calc;
}
}
# 把pem、key文件放入cert目录。
service nginx reload # 重新加载
# 访问https://172.17.0.2:443,验证成功。
保存工作成果
docker stop ubuntu # 停止容器
docker commit ubuntu ubuntu-nginx # 提交容器到镜像
docker rm ubuntu # 删除容器
测试主机绑定
docker run -itd -p 80:80 --name=nginx ubuntu-nginx /bin/bash
docker attach nginx
vim /etc/nginx/sites-available/my_nginx.conf
# 把server_name的ip改成127.0.0.1。
service nginx start
# 从宿主机访问https://127.0.0.1,验证成功。
在生产环境使用
docker run -itd -p 80:80 -p 443:443 --name=nginx ubuntu-nginx /bin/bash
docker attach nginx
vim /etc/nginx/sites-available/my_nginx.conf
# 把server_name的ip改成对应的域名。
# 把upstream的ip改成实际ip。
service nginx start
# 从公网访问域名,验证成功。