项目上线部署
项目上线部署
上线架构图
服务器
前后端服务,我们都会按照一定的策略部署到服务器上,
可以自己买服务器,也可以租云服务器,如阿里云、腾讯云。
租借的服务器,会自动的配置好基础的环境,本文的服务器是基于centos7系统的服务器。
服务器准备好后,我们需要通过ssh连接,去连接服务器。
ssh连接
SSH (安全外壳协议)为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
我们可以通过xshell、finalshell等软件连接服务器。
其中finalshell的下载地址:http://www.hostbuf.com/t/988.html
mac或者git的bash命令也提供ssh连接命令:
ssh root@10.0.0.2
# 输入用户名密码,部署的话我们就用root用户(生产环境中我们一般没有root账号,自己买个云服务器玩玩)
只要有ssh连接,就能够去远程操作部署服务端
服务器基本配置
配置一下服务器,装一些常用的依赖
yum update -y
yum -y groupinstall "Development tools" # 装了一堆开发用的工具,git
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
内网穿透
如果没有注册公网ip,或者说想在内网的虚拟机环境下配置自己的上线项目进行测试,但是又想让外网访问到内网(主要是测试一些外调接口的运行状态),那就需要用到内网穿透。
内网穿透需要用到一些软件:
如开源的:frp、ngrok
商业的软件:花生壳(转发http需要收费6元)、神卓互联(收费)
这里不赘述,直接附上老刘的文章链接: 内网穿透方案大全
centos7安装mysql
回到家路径cd
或cd ~
下载mysql57
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
安装mysql57
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum install mysql-community-server --nogpgcheck -y
启动mysql57并查看启动状态
systemctl start mysqld.service
systemctl status mysqld.service
查看默认密码并登录
grep "password" /var/log/mysqld.log
mysql -uroot -p
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'
centos7安装redis
前往用户根目录cd
下载redis-5.0.5
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压安装包
tar -xf redis-5.0.5.tar.gz
进入目标文件并编译环境
cd redis-5.0.5
make
复制环境到指定路径完成安装
cp -r ~/redis-5.0.5 /usr/local/redis
配置redis可以后台启动:修改下方内容
vim /usr/local/redis/redis.conf
daemonize no ---> yes
# 修改文件后退出存储
esc
:wq
建立软连接(因为/usr/local/redis/src没有加到环境变量)
>: ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server
>: ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli
# /usr/bin 在环境变量中,所以可以直接访问到其中的命令
后台运行redis(一般会运行在6379端口)
cd /usr/loca/redis
redis-server redis.conf & # 通过配置文件启动server端
查看是否正常在运行
ps aux |grep redis
测试redis环境(启动客户端尝试连接)
redis-cli
强行关闭redis服务
pkill -f redis -9
以上指令也可以套用到其他服务上,检测服务是否启动,强制关闭服务
centos安装python解释器
linux系统上本身就配置了python解释器,但是版本都比较低,我们下载高版本的python时,需要注意区分安装名字。
如我们下载python3.8,那么尽量将安装位置文件夹命名为3.8以作区分。
下载Python3.8.6服务器终端
wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz
# 地址栏输入https://registry.npmmirror.com/-/binary/python/可以查看各版本的下载路径
解压安装包
tar -xf Python-3.8.6.tgz
进入目标文件
cd Python-3.8.6
配置安装路径:/usr/local/python3.8
configure --prefix=/usr/local/python3.8
编译并安装到配置的安装路径
make && make install
# 如果报错,安装以下依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y
建立软连接(快捷方式+环境变量)
ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8
删除安装包与文件
rm -rf Python-3.8.6
rm -rf Python-3.8.6.tar.xz
centos7安装uwsgi
django flask项目上线,需要使用uwsgi部署,性能高,符合wsig协议的web服务器
使用uwsgi运行django,不再使用测试阶段的wsgiref来运行django了uwsgi是符合wsgi协议的web服务器,使用c写的性能高,上线要使用uwsgi
真实环境下安装:
pip3.8 install uwsgi
# 建立软连接
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi
python启动虚拟环境
建立一个新的虚拟环境
python3.8 -m venv 虚拟环境名 # 在什么目录下创建就存在于哪里
python3.8 -m venv luffy_venv
建立虚拟环境软连接(其实挂了也用不了activate)
ln /root/.venv/for_luffy/bin/activate /usr/bin/activate_luffy_venv
配置虚拟环境(开机自启虚拟环境)
vim ~/.bash_profile
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /root/.venv/for_luffy/bin/activate
其实linux系统中脚本文件都是需要source在前面才能运行:
source 脚本文件 # 同样可以用以下语法代替,又称点命令 . 脚本文件
更新配置文件内容
source ~/.bash_profile
启动和退出虚拟环境
真实环境中】# source 虚拟环境的activate脚本
虚拟环境中】# deactivate
centos7安装nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点
功能:
- 转发http请求:监听某端口,将其转发到本机的某端口
- 代理静态文件
- 负载均衡
- 反向代理,隐藏服务器簇实际位置
下载、解压、进入目标文件
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xf nginx-1.13.7.tar.gz
cd nginx-1.13.7
配置安装路径并编译安装
configure --prefix=/usr/local/nginx
make && sudo make install
建立软连接:终端命令 nginx
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
直接敲nginx命令即可启动nginx监听
正向代理和反向代理:
代理服务指一台计算机请求代理计算机向另一台计算机发送数据并返回回应
正向代理就是指客户端请求代理向服务端发送请求,并将返回响应内容拿回,对于服务端来说,这个请求就是代理计算机发起的,可以隐藏原客户端的信息
反向代理就是指服务端在监听请求时,是由代理计算机监听转发的,并将响应内容再返回给客户端,对于客户端来说,资源地址就是代理地址,可以隐藏原服务端的信息
本文的nginx就是一个强大的反向代理服务器,部署迅速,稳定高效。
路飞项目前端部署
Vue项目不能直接部署,需要编译成纯html、css、js的纯静态文件,注意将settings的一些配置更改,如接口根网址:
BASE_URL:服务器公网ip:指定端口/api/v1
编译前端
在项目根目录执行
npm run build
会在根目录生成一个dist文件夹,将其打包成zip,并上传。
部署到服务器
解压zip需要借助unzip工具
yum install unzip -y
unzip dist.zip
# 解压到一个能找到的文件夹,如这里我们解压到/home/html/下
# 这样会存在一个/home/html/dist/存放所有的前端静态文件
配置nginx监听分发端口
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bakeup # 备份原配置
vim nginx.conf # 写入新配置
# 写入时记得删除注释(中文可能导致配置失效)
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name 127.0.0.1;
# 部署前端的域名,如果nginx和前端资源在同一机器上,可以用回转地址127.0.0.1
charset utf-8;
location / { # 在根路由下将会访问
root /home/html/dist; # html访问路径
index index.html; # html文件名称
try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
}
}
}
# 重启nginx
nginx -s reload
路飞项目后端部署
提交本地代码到git
先将本地分支切换到master,将dev分支的内容合并上去。
上线配置文件修改:
- debug模式-->False
- ALLOWED_HOSTS=['*']
- 支付宝后端地址
- 数据库地址、redis地址(像上文一样部署到一台机器时,用回转地址也是可以的)
生成项目依赖文件
pip freeze >requirements.txt
建立一个上线的启动文件manage_prod.py
# 复制manage.py文件,修改启动的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')
提交到git远程仓库push,在服务器上用git工具克隆下来
配置项目数据库
数据库部署在同一服务器,按测试库一样建立上线库即可:
mysql -uroot -p
create database luffy default charset=utf8;
grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
flush privileges;
quit
迁移初始数据库
首先要执行迁移命令:
python manage_pro.py makemigrations
python manage_pro.py migrate
可以借助navicat的转储功能,将一个数据库转储为sql文件,然后在我们建立的库中运行sql文件即可克隆迁移数据库。
安装项目依赖
进入虚拟环境
source activate_luffy_venv # 前文挂的软链接
根据requirements文件下载依赖
pip install -r requirements.txt
过程中可能有些模块装不上,如mysqlclient,此时进入requirements.txt文件编辑,用#注释掉这个模块,先将其他依赖批量下载好。
#mysqlclient
然后在单独解决。
mysqlclient就可能通过以下方式解决:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
yum install mysql-devel -y
yum install python-devel -y
虚拟环境中下载uwsgi
正式环境需要使用uwsgi启动django
pip install uwsgi
配置uwsgi文件(可以采取ini,xml的方式)
在项目文件夹下写一个新文件luffyapi.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只监听uwsgi协议的请求。
所以需要nginx作分发:
vim /usr/local/nginx/conf/nginx.conf
插入一个serve:
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