Linux - Django项目上线服务器
目录
1 上线架构图
nginx:
① 请求转发
② 负载均衡
上线时候:前端是编译后的纯静态html、css、js
2 阿里云服务器
配置
-yum update -y # 装了一堆开发用的工具,git -yum -y groupinstall "Development tools" -yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
3 云服务器安装mysql
1)前往用户根目录 >: cd ~ # 回到你家路径 /root 2)下载mysql57 >: wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 3)安装mysql57 >: yum -y install mysql57-community-release-el7-10.noarch.rpm >: yum install mysql-community-server --nogpgcheck -y 4)启动mysql57并查看启动状态 >: systemctl start mysqld.service >: systemctl status mysqld.service 5)查看默认密码并登录 >: grep "password" /var/log/mysqld.log # Hay(:PiB+9NE # Hay(:PiB+9NE >: mysql -uroot -p 6)修改密码 >: ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; >: ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root123?';
4 云服务器安装redis(源码安装)
1)前往用户根目录 >: cd ~ 2)下载redis-5.0.5 >: wget http://download.redis.io/releases/redis-5.0.5.tar.gz 3)解压安装包 >: tar -xf redis-5.0.5.tar.gz 4)进入目标文件 >: cd redis-5.0.5 5)编译环境 >: make # 在src路径下会有可执行文件:redis-server redis-cli 6)复制环境到指定路径完成安装 >: cp -r ~/redis-5.0.5 /usr/local/redis 7)配置redis可以后台启动:修改下方内容 >: vim /usr/local/redis/redis.conf daemonize yes 8)完成配置修改 >: esc >: :wq 9)建立软连接(因为/usr/local/redis/src没有加到环境变量) # /usr/bin/ 在环境变量中,所有以后直接敲redis-server就能找到了 >: ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server >: ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli 10)后台运行redis >: cd /usr/local/redis >: redis-server ./redis.conf & # 查看是否正常在运行:ps aux |grep redis ctrl + c 11)测试redis环境 >: redis-cli ctrl + c 12)关闭redis服务 >: pkill -f redis -9
5 云服务器安装python3.8(源码安装)
# linux mac 系统服务是用python写的 python2 写的,所以这俩系统中默认自带了python2,不要写在 # 阿里云的centos 自动装了python3.6 # 你的云服务器上有python2 和python3.6 # 自己装python3.8 # centos安装:yum install python 可以快速安装,但是不能指定版本,不能指定安装目录 # 源码安装了 # 可以使用yum 安装,不能指定版本 #源码安装,下载指定版本的源码,编译安装 # 所有linxu和mac,都自带python2:系统服务,是用python写的 # 阿里云的centos默认装了python3.6 # python2,python3.6 python3.8 ###### 源码安装python,依赖一些第三方zlib* libffi-devel####### yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y # 1前往用户根目录 >: cd ~ #2 下载 或 上传 Python3.8.6 服务器终端 wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz #3 解压安装包 tar -xf Python-3.8.6.tgz #4 进入目标文件 cd Python-3.8.6 #5 配置安装路径:/usr/local/python3 # 把python3.8.6 编译安装到/usr/local/python38路径下 >: ./configure --prefix=/usr/local/python38 #6 编译并安装,如果报错,说明缺依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y make && make install #7 建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3 #没有吧/usr/local/python38/bin加入到环境变量 ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8 ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8 # 机器上有多个python和pip命令,对应关系如下 python 2.x python3 3.6 pip3 python3.8 3.8 pip3.8 #8 删除安装包与文件: >: rm -rf Python-3.8.8 >: rm -rf Python-3.8.8.tar.xz
6 安装uwsgi
# django flask项目上线,需要使用uwsgi部署,性能高,符合wsig协议的web服务器 # 使用uwsgi运行django,不再使用测试阶段的wsgiref来运行django了 # uwsgi是符合wsgi协议的web服务器,使用c写的性能高,上线要使用uwsgi # 安装步骤 1)在真实环境下安装 pip3.8 install uwsgi #安装到了python38的安装路径的bin路径下了 2)建立软连接 ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi
7 安装虚拟环境
1)安装依赖 >: pip3.8 install virtualenv >: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/ >: pip3.8 install virtualenvwrapper
如果安装不了virtualenvwrapper
,则试一试执行
# 升级pip版本 python3.8 -m pip install --upgrade pip #升级setuptools python3.8 -m pip install --upgrade setuptools pip3.8 install pbr
执行完可以安装virtualenvwrapper
接着安装
2)建立虚拟环境软连接 >: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv 3)配置虚拟环境:填入下方内容 # ~/ 表示用户家路径:root用户,就是在/root/.bash_profile >: vim ~/.bash_profile VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8 source /usr/local/python38/bin/virtualenvwrapper.sh 4)退出编辑状态 >: esc 5)保存修改并退出 >: :wq 6)更新配置文件内容 >: source ~/.bash_profile 7)虚拟环境默认根目录:~/.virtualenvs 8) mkvirtualenv -p python3.8 luffy
8 安装nginx(源码安装)
# nginx:软件 -Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点 -运行在服务器上,监听某个端口,可以向这个服务器发送http请求了 -转发http请求,代理静态文件,负载均衡 # 安装nginx 1)前往用户根目录 >: cd ~ 2)下载nginx1.13.7 >: wget http://nginx.org/download/nginx-1.13.7.tar.gz 3)解压安装包 >: tar -xf nginx-1.13.7.tar.gz 4)进入目标文件 >: cd nginx-1.13.7 5)配置安装路径:/usr/local/nginx >: ./configure --prefix=/usr/local/nginx 6)编译并安装 >: make && sudo make install 7)建立软连接:终端命令 nginx >: ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 8)删除安装包与文件: >: cd ~ >: rm -rf nginx-1.13.7 >: rm -rf nginx-1.13.7.tar.xz 9)测试Nginx环境,服务器运行nginx,本地访问服务器ip >: nginx # 查看nginx服务 ps aux |grep nginx >: 服务器绑定的域名 或 ip:80
nginx代理静态资源的页面:在 html 文件夹下
9 路飞前端部署
9.1 前端部署前准备:
① 把ajax远程链接的地址改成服务器的地址
export default { BASE_URL: 'http://101.132.188.28:8080/api/v1' }
② 把vue的项目编译成纯粹的静态文件
npm run build
编译后放在dist文件夹中
9.2 编译后上传、解压dist文件
上传
- 在云服务器上安装上传下载的软件 yum install -y lrzsz rz 选择上传就行
解压
- 解压 zip yum install unzip -y unzip dist.zip
9.3 修改nginx配置文件,实现代理路飞前端
1)来到nginx安装目录的conf路径下 cd /usr/local/nginx/conf 2)mv nginx.conf nginx.conf.bak 3)vim nginx.conf # 写入配置 4)写入 events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; server_name 127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80 charset utf-8; location / { root /home/html; # html访问路径 index index.html; # html文件名称 try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题 } } } # 保存并退出 :wq 5)把dist下的所有内容,cp到 /home/html # 注意路径 cd 到根目录下 cp -r dist /home/html 6)重启ngixn nginx -s reload 7)通过公网访问前端页面 http://101.132.188.28/ 前端页面
此时通过公网访问的前端页面,就是home下的html中的index.html页面
10 路飞后端部署
10.1 修改配置文件
① 修改上线用的配置文件 prod.py
将开发的配置文件 dev.py
复制到prod.py
# 1 修改DEBUG DEBUG = False # 2 ALLOWED_HOSTS改成 服务器地址 ALLOWED_HOSTS = ['101.132.188.28'] # 3 mysql 和 redis的地址都应改成对应的地址 DATABASES = { 'default': { ... 'HOST': mysql服务器地址, ... }, } CACHES = { 'default': { ... "LOCATION": redis的服务器地址, ... } } # 4 修改后端地址和前端地址 # 后端地址 BACKEND_URL = 'http://101.132.188.28:8090' # 前端地址 LUFFY_URL = 'http://101.132.188.28'
② 修改上线用的运行文件manage_prod.py
修改上线用的配置文件 为 prod.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')
③ 项目导出依赖包到requirements.txt
中
pip freeze > requirements.txt
10.2 提交本地代码到git
推荐:将每个app下的migrations中的迁移记录删掉,防止多人协同开发的时候产生冲突
10.3 部署到服务器上
# 创建home下的project目录 mkdir /home/project # 切换到project目录 cd /home/project # git克隆 git clone https://gitee.com/duoduosg/luffy_api.git/
10.4 配置luffy数据库
1)管理员连接数据库 >: mysql -uroot -p 2)创建数据库 >: create database luffy default charset=utf8; 3)设置权限账号密码:账号密码要与项目中配置的一致 >: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?'; >: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?'; >: flush privileges; 4)退出mysql >: quit; # 本地使用Navicate连接
10.5 安装项目依赖,迁移数据库
####### 在远端,安装项目依赖########### 进入到虚拟环境,进入到项目路径下,执行 workeon luffy # 如果mysqlclient装不上,先把mysqlclient注释 pip install -r requirements.txt
如果mysqlclient安装不上,先在requirements.txt中将其注释掉,先安装其他的依赖
按照下面步骤安装
yum install mysql-devel -y yum install python-devel -y rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 pip install mysqlclient
接着 要在虚拟环境中也安装uwsgi
#### 重点 要在虚拟环境中也安装uwsgi pip install uwsgi #### 迁移数据库#### python manage_prod.py makemigrations python manage_prod.py migrate ##### 迁移的记录文件,要不要提交到git上###### -官方推荐:提交 -我推荐:如果多人开发,不提交 python manage_prod.py makemigrations python manage_prod.py migrate # 录入数据,我们由于是测试,把本地的sql导出,导入到远端
10.6 使用uwsgi启动django
# 运行django(个人经验,先用wsgiref运行起来,再用uwsgi跑) -原来测试阶段,使用wsgiref运行 -跑起来,访问测试一下,你们可能访问不到 -原因是:安全组开启 8888和8080端口 -最后期:只留22,3306,6379,80,8080 -上线使用uwsgi # 使用uwsgi步骤 -写一个uwsgi的配置文件(ini,【xml】) vim luffyapi.xml <uwsgi> <socket>127.0.0.1:8888</socket> <!-- 内部端口,自定义 --> <chdir>/home/project/luffy_api/</chdir> <!-- 项目路径 --> <module>luffy_api.wsgi</module> <!-- luffyapi为wsgi.py所在目录名--> <processes>4</processes> <!-- 进程数 --> <daemonize>uwsgi.log</daemonize> <!-- 日志文件 --> </uwsgi> # 使用uwsgi启动djagno uwsgi -x ./luffyapi.xml ps aux |grep uwsgi # 看到有四个进程说明没问题 # 现在访问8888,没有响应 -uWSGI:配置文件是socket,说明它只能监听 uwsgi协议,浏览器发出去的是http协议,它不能响应 -只能http请求发送到nginx上,使用nginx把http请求,转发到uwsgi,nginx支持把http协议转成uwsgi # 修改nginx 配置文件,完成对http请求的转发 server { listen 8080; server_name 127.0.0.1; charset utf-8; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8888; uwsgi_param UWSGI_SCRIPT luffy_api.wsgi; uwsgi_param UWSGI_CHDIR /home/project/luffy_api/; } } # 重启nginx nginx -s reload # 访问前端,查看
- 修改项目后,重新使项目生效,需要重启uwsgi
① 关闭uwsgi的进程
pkill -9 uwsgi
② 进入项目目录下然后启动uwsgi的配置文件 xml
uwsgi -x luffyapi.xml --------[显示如下即可]-------- [uWSGI] parsing config file luffyapi.xml
- 当项目上线出错了之后
① 先用wsgiref运行起来,如果项目都运行不起来就是项目的问题
② 排查nginx的问题,查看日志文件,是否是nginx代理配置问题
③ 排查uwsgi的问题,查看日志文件,是否是uwsgi的问题
④ 在排查项目的log日志文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!