手把手教你如何从零开始部署一个Python项目到服务器

Python的安装

安装python3 必要的库

yum -y install zlib* gcc-c++

创建安装目录

mkdir /usr/local/python3

进入安装目录

cd /usr/local/python3

下载python安装包

wget --no-check-certificate https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

解压包

tar -xzvf Python-3.7.9.tgz 

进入安装包

cd Python-3.7.9

指定安装目录

# 如果此命令报错,则可能是没有安装gcc库,安装即可
# 安装命令 yum install gcc-c++
# configure: error: no acceptable C compiler found in $PATH

./configure --prefix /usr/local/python3/

编译 安装

make & make install 

创建pytho3软连接

ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装pip3

创建文件夹并进入

mkdir /usr/local/pip3
cd /usr/local/pip3

下载源代码

wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz

解压文件

tar -zvxf 9.0.1.tar.gz

进入文件

cd pip-9.0.1

使用python3安装

python3 setup.py install 
#这一步是什么意思呢
#python setup.py install包括两步:python setup.py build, python setup.py install,这两步,可分开执行, 也可只执行python setup.py install, 因为python setup.py install总是会先build后install. 
#python setup.py build 是python编译这个module的过程, 这个过程比较复杂,最后会生成build文件夹。除去build过程后的install过程,就是复制build/lib文件到用户指定的lib库。

创建pip3软连接

ln -s /usr/local/python3/bin/pip /usr/bin/pip3

升级pip3

 pip3 install --upgrade pip

Ngixn的下载与启动

什么是Nginx :Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,
Nginx官网:http://nginx.org/

安装nginx必要的依赖

yum install gcc gcc-g++ pcre pcre-devel zlib zlib-devel 
openssl openssl-devel autoconf automake make

下载nginx安装包

wget http://nginx.org/download/nginx-1.22.0.tar.gz

解压安装包

tar vfxz nginx-1.22.0.tar.gz

进入安装包根目录并编译安装

cd nginx-1.22.0

# 设置配置项,指定安装位置
./configure --prefix=/usr/local/nginx

# 编译安装
make & make install

运行nginx程序

./sbin/nginx

Mysql下载与上传数据

下载mysql安装包

#mysql 8.0
wget http://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

安装mysql仓库源

# MySQL8.0
rpm -Uvh mysql80-community-release-el7-5.noarch.rpm

查看当前拥有的仓库

 yum repolist all

安装mysql服务

yum -y install mysql-server

启动mysql服务

systemctl start mysqld

修改mysql临时密码

# 找到临时密码并复制
grep 'temporary password' /var/log/mysqld.log
# 使用临时密码先登录
mysql -uroot -p

# 如果密码太简单,则会报如下错误: ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
ALTER USER 'root'@'localhost' IDENTIFIED BY 'QQQ999...'; 

# 允许MySQL远程连接
use mysql;

# 查看所有用户
select Host,User from user;

# 修改root用户为允许远程访问
update user set Host='%' where User='root';

# 刷新权限,不刷新则可能权限不生效
flush privileges;

# 退出MySQL

数据库导入命令

#第一步创建与后端项目同名的库
mysql>create database books;
#第二步进入库
mysql>use books;
#第三部 使用我们从本地导入进来的sql数据文件
mysql>source /home/book/book.sql;

数据库修改后 后端项目中的数据库连接地址也是需要修改的

    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://sql用户名:sql用户密码@服务器域名:3306/你的表名'

Redis的安装与启动

Redis版本库:https://download.redis.io/releases/
下载安装包

wget https://download.redis.io/releases/redis-4.0.2.tar.gz

解压包

tar xzf redis-4.0.2.tar.gz

进入目录 安装

#进入源码包的目录
cd redis-4.0.2

#编译
make

启动redis

#进入redis目录里 
cd src
#执行
./redis-server

此页面代表redis运行成功

下载辅助工具

通常,我们需要上传本地文件到服务器,或者从服务器下载文件到本地。
一般来说,方法多种多样。我们可以通过SCRT提供的一个辅助工具来进行

yum -y install lrzsz
sz # 从服务器下载某文件到本地
rz # 从本地上传某文件到服务器

Gunicorn的安装与启动

  1. 打包本地的后端项目
  2. 使用rz上传压缩包到服务器
  3. 解压后端项目 并创建虚拟环境
# 进入解压后的后端项目的目录里
cd /home/www/book
# 创建虚拟环境文件夹
mkdir venv
# 创建虚拟环境
python3 -m venv venv
#激活虚拟环境
source venv/bin/activate


此时 服务器名字前有(venv) 就代表进入了虚拟环境

在虚拟环境里 安装项目所需的依赖

安装后端项目里的所有依赖  可以把所有依赖写到一个文件夹里上传 进行下载
pip3 install -r req_new.txt

安装gunicorn第三方库

pip3 install gunicorn

启动服务

gunicorn -w 8 -b 0.0.0.0:8000 app:app

前端项目的上传

前端项目编译

npm run build

编译完项目后 会生成一个叫dist的文件夹


里面主要的内容


把dist上传到服务器后 大致工作就已经完成了 还差最后一步! 设置反向代理
来到nginx的配置文件 vim /usr/local/nginx/conf/nginx.conf

#前端的虚拟服务
server {
        listen 80;  #监听的端口
        server_name app.zy.com; #监听域名
        location / {    #访问路由
           root /home/book_vue/dist;  #前端文件的路径 可以是相对路径(相对于nginx而言),也可以是绝对路径
           index index.html; #如果访问url没有指定文件,优先找哪个文件,从前往后找,找到既停
            }
        }



#后端的虚拟服务
       server {
        listen 80; # 监听端口
        server_name books.zy.com; # 监听域名
        location / {
                proxy_pass http://127.0.0.1:8000;  # 转发到gunicorn服务
               proxy_set_header Host $host; # 把原始的host请求头传递到gunicorn
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 把原始的请求>信息传递到gunicorn
        }
}

如果访问页面访问不到,可能是防火墙的原因 ,关闭防火墙后重试
防火墙命令

# 开启防火墙
systemctl start 服务名
# 关闭防火墙(服务器重启后还会自动开启防火墙)
systemctl stop firewalld
# 禁止防火墙开机启动
systemctl disable firewalld