生产环境部署Django项目
2024-08-23 07:52:56
生产环境部署Django项目
1、 部署架构
IP地址 |
安装服务 |
172.16.1.251 |
nginx |
uwsgi(sock方式) |
|
docker |
|
mysql5.7 |
|
redis5 |
Nginx
前端Web服务,接收到动态请求通过uwsgi模块将请求转发给uwsgi服务器,uwsgi服务器通过django处理完后返回给Nginx,Nginx返回用户浏览器展示。
既然uwsgi是一个可以独立部署的服务器,为什么还用Nginx代理?
• Nginx作为入口可配置安全策略,并且可以为uwsgi提供负载均衡。
• Nginx处理静态资源能力强
2、将本地开发的项目打包
2.1
导出依赖模块列表
pip3 freeze > requirements.txt
2.2
修改数据库为Mysql
# vim devops/settings.py
#####
关闭debug模式和白名单
DEBUG = False
ALLOWED_HOSTS = ['172.16.1.251']
#
白名单,只允许通过列表中的ip访问django项目,* 代表所有(不建议),默认是127.0.0.1。
##### mysql
配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '172.16.1.251',
'PORT': '3306',
}
}
##### redis
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('172.16.1.251', 6379)],
},
},
}
3、服务器环境准备
3.1
安装Python3
# yum install zlib-devel libffi-devel mysql-devel -y
# tar -zxvf Python-3.8.6.tgz
# cd Python-3.8.6
# ./configure
##### ./configure --enable-optimizations
# make -j 4 && make install
3.2
安装依赖模块列表
# pip3 install -r /root/requirements.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
在安装过程中,twisted指定的版本比较新,在仓库里没有,需要单独安装:
# yum install bzip2
# tar -jvxf Twisted-20.3.0.tar.bz2
# cd Twisted-20.3.0
# python3 setup.py install
可能会遇到错误:Can’t connect to HTTPS URL because the SSL module is
not available
大致意思是无法使用HTTPS,不能下载相关依赖包。
可能原因:依赖系统openssl的版本低或者系统没有安装
安装perl5:
# tar zxvf perl-5.28.0.tar.gz
# cd perl-5.28.0
# ./Configure -des -Dprefix=/usr/local/perl5
# make -j 4 && make install
安装openssl:
# tar zxvf openssl-1.1.1i.tar.gz
# cd openssl-1.1.1i
# ./config --prefix=/usr/local/openssl
# make -j 4 && make install
# ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
# ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
重新编译python:
# cd Python-3.8.6
# ./configure --with-openssl=/usr/local/openssl/
##### ./configure --enable-optimizations --with-openssl=/usr/local/openssl/
# make -j 4 && make install
3.3 安装数据库
MySQL:
# docker run -d --name db -p 3306:3306 -v /mysql/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8
# docker exec -it db bash
# root@e2eff2d75dd2:/# mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "create database test;"
# root@e2eff2d75dd2:/# exit
Redis:
# docker run --name redis -d -p 6379:6379 redis:5
启动开发环境,验证依赖模块:
# mkdir -p /opt/k8s
# cp -a /root/devops.zip /opt/k8s/
# cd /opt/k8s/
# unzip devops.zip && rm -f devops.zip
# python3 manage.py runserver 0.0.0.0:8080
如果报缺少依赖包,需要再次执行如下命令:
# pip3 install -r /root/requirements.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
测试问题,同步数据库:
python3 manage.py migrate
3.4
安装与配置uwsgi
uWSGI是一个Web服务器,也是Python的一个模块,直接pip安装即可:
# pip3 install uwsgi -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
创建uwsgi配置文件,路径任意:
# cd /opt/k8s
# cat uwsgi.ini
[uwsgi]
#
项目目录
chdir = /opt/k8s
#
指定sock的文件路径,本地sock访问时使用
socket = /opt/k8s/uwsgi.sock
#
指定监听端口,http远程访问时使用
# http = 0.0.0.0:8080
#
静态资源,uwsgi访问方式时使用
# static-map = /static=/opt/k8s/static
# wsgi
文件(django入口)
wsgi-file=devops/wsgi.py
#
进程个数
processes = 4
#
指定项目的应用
# module = devops.wsgi
#
进程pid
pidfile = /opt/k8s/uwsgi.pid
#
日志路径
# daemonize = /opt/k8s/uwsgi.log
# uwsgi
服务以守护进程运行)会导致sytemctl启动时多次重启而导致启动失败,
#
需要改为如下所配置。
logto = /opt/k8s/uwsgi.log
#
指定启动django项目的用户名和用户组
uid = nginx
gid = nginx
将uwsgi加入到systemd中进行管理:
# cat /usr/lib/systemd/system/uwsgi.service
[Unit]
Description=uwsgi server
After=network.target
[Service]
WorkingDirectory=/opt/k8s
ExecStart=/usr/local/bin/uwsgi --ini /opt/k8s/uwsgi.ini
ExecStop=/usr/local/bin/uwsgi --stop /opt/k8s/uwsgi.pid
ExecReload=/usr/local/bin/uwsgi --reload /opt/k8s/uwsgi.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
3.5
配置Nginx
# yum install nginx -y
# id nginx
uid=997(nginx) gid=993(nginx) groups=993(nginx)
# vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
server_name _;
location / {
include uwsgi_params;
#
导入模块用于与uwsgi通信
uwsgi_pass unix:/opt/k8s/uwsgi.sock;
# uwsgi_pass http://172.16.1.251:8080;
}
#
静态文件目录
location /static {
alias /opt/k8s/static;
}
}
# nginx -t
3.6
赋权
# chown -R nginx.nginx /opt/k8s/
3.7
启动
# systemctl restart uwsgi.service
# systemctl enable uwsgi.service
# systemctl restart nginx.service
# systemctl enable nginx.service
访问测试
http://172.16.1.251
3.8
uwsgi补充说明
uwsgi
类似于php-fpm,可以单独配置在一台服务器上,可以通过socket本地访问(性能高),也可以通过http的方式远程进行访问,既能处理动态请求也能处理静态请求。
如下配置选项可以通过nginx代理服务进行本地访问:uwsgi_pass unix:/opt/k8s/uwsgi.sock;
#
指定sock的文件路径,本地sock访问时使用
socket = /opt/k8s/uwsgi.sock
如下配置选项可以通过nginx代理服务进行http访问:uwsgi_pass http://172.16.1.251:8080;
#
指定监听端口,http远程访问时使用
http = 0.0.0.0:8080
如下配置选项可以通过uwsgi http方式进行访问:http://172.16.1.251:8080/
#
指定监听端口,http远程访问时使用
http = 0.0.0.0:8080
#
静态资源,uwsgi访问方式时使用
static-map = /static=/opt/k8s/static
最新文章
- 控件(弹出类): FlyoutBase, Flyout, MenuFlyout
- mysql之触发器入门
- mysqldump使用语法
- VMware11安装Mac OS X10提示不可恢复错误解决
- 程序员提高工作效率的15个技巧【Facebook】
- 实习之vim基本学习
- jquery select三级联动
- tky项目第①个半月总结
- Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
- Binder机制,从Java到C (10. Binder驱动)
- 使用for循环运算
- python 动态加载类对象
- es6重点笔记:对象
- Python selenium 三种等待方式详解
- Bookmarkable Pages
- IPC rtsp转发服务器搭建
- Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录
- Python学习笔记015——文件file的常规操作(二进制文件)
- Qt SD卡 文件系统挂载、文件预览
- (转)Inno Setup入门(二十一)——Inno Setup类参考(7)