配置本地django开发环境,通过docker+uwsgi发布

3 篇文章 0 订阅
2 篇文章 0 订阅

最初的最初

工作环境: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
# 从公网访问域名,验证成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值