项目部署:网站部署到aws服务器(python)
1. 准备:
- 任意一个云服务器(阿里云,AWS,百度云,均可)
- 一个已经完成的WEB项目
2. 开始部署
2-1. 设置服务器安全组
tips: 每个服务器的设置安全组不一样,可自行参考自己服务器如何设置
打开常用端口(高手可自行指定端口)
- 80/80 Nginx的默认端口
- 3306/3306 mysql的默认端口
- 6379/6379 redis的默认端口
- 23/23
- 443/433
- 22/22
- 80/80
- 3389/3389
2-2. 安装Python环境(本次3.7为例,服务器有的话,可以不需要安装)
-
安装依赖包:
yum install opensll-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ opensll-devel libffi-devel python-devel mariadb-devel
-
下载Python源码
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
下载tar -xzvf Python-3.7.3.tgz -C /tmp
解压到/tmpcd /tmp/Python-3.7.3
切换到tmp -
把Python3.7安装到 /usr/local目录
./configure --prefix=/usr/local
make
make altinstall
# 这一步比较耗时 -
更改/usr/bin/python链接
ln -s /usr/local/bin/python3.7 /usr/bin/python3
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
tips: 当已有链接时可执行 -sf 覆盖
ln -sf /usr/local/bin/python3.7 /usr/bin/python3
ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3
2-3. 安装MySQL
-
下载 MySQL yum包
wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm
-
安装MySQL源
rpm -Uvh mysql57-community-release-el7-10.noarch.rpm
-
安装MySQL服务端,需要等待一些时间
yum install -y mysql-community-server
-
安装Mysql服务端时 下载速度太慢?
可以通过国内源载本地下载以下四个文件:
推荐源:http://uni.mirrors.163.com/mysql/Downloads/
下载的文件(以mysql5.7.26为例):
mysql-community-client-5.7.26-1.el7.x86_64.rpm
mysql-community-common-5.7.26-1.el7.x86_64.rpm
mysql-community-libs-5.7.26-1.el7.x86_64.rpm
mysql-community-server-5.7.26-1.el7.x86_64.rpm -
启动MySQL
systemctl start mysqld.service
# 后台启动 -
检查是否启动成功
systemctl status mysqld.service
-
获取临时密码,MySQL5.7为root用户随机生成了一个密码
grep 'temporary password' /var/log/mysqld.log
-
通过临时密码登录MySQL,进行修改密码操作
mysql -uroot -p
-
因为MySQL的密码规则需要很复杂,我们一般自己设置的不会设置成这样,所以我们全局修改一下
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码';
-
授权其他机器远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;
`FLUSH PRIVILEGES;`
-
以上操作后,远程不能连接,记得检测云服务器安全组,是否开启对应端口。
-
设置MySQL的字符集为UTF-8,令其支持中文
vim /etc/my.cnf
[mysql]
default-character-set=utf8
-
重启MySQL
systemctl restart mysqld.service
-
查看MySQL运行状态
ps -aux|grep mysqld
2-4. 安装Redis
-
安装redis
yum install redis
-
启动redis
systemctl start redis
2-5. 安装虚拟环境
tips:
使用虚拟环境,当项目多时,更方便维护和管理,这里以pipenv为例
pip3 install pipenv
安装虚拟环境- mkdir 你的文件夹 创建自己的文件夹
2-6. 两种方法上传项目到服务器
2-6-1. 方法1,使用FileZilla上传项目
下载地址及安装方法,可以自行百度。都很简单
-
将本地的环境导出,以便在服务器上安装
pip freeze > requirements.txt
-
将本地环境安装到服务器
pip install -r requirements.txt
-
创建数据库
create database bbs charset=utf8;
-
重新映射数据库(以flask框架为例)
# 删除原有的映射文件
rm -rf migrations/
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
- 映射完成后,通过ip去访问
http://xxx.xxx.xxx.xxx:port/
2-6-2. 使用scp命令上传
-
有xxx.pem的上传方式
scp -i 你的pem -r 文件目录 用户名@主机IP:保存到的路径
示例:
scp -i C:\Users\Administrator\Desktop\xxx.pem -r G:\ceshi\job\xxx centos@0.0.0.0:/home/centos/project
-
不需要xxx.pem时
scp -p 22 文件 h@主机地址:desktop/文件路径
-
tips:
传目录时要指定-r 不指定只能传入文件而不是目录
2-7. 安装uwsgi
介绍:
uwsgi是一个应用服务器,非静态文件的网络请求就必须通过他完成, 他也可以充当静态文件服务器,但不是他的
强项。uwsgi是使用python编写的,因此通过pip3 install uwsgi就可以了。(uwsgi必须安装在系统级别的Python环
境中,不要安装到虚拟环境中)。然后创建一个叫做uwsgi.ini的配置文件:
[uwsgi]
# 必须全部为绝对路径
# 项目的路径
chdir = /root/flask-project/bbs/
# flask的wsgi文件
wsgi-file = /root/flask-project/bbs/bbs.py
# 回调的app对象
callable = app
# Python虚拟环境的路径 pipenv --venv 进入到虚拟环境,目录里面执行
home = /root/.local/share/virtualenvs/flask-project--bwy33Ao
# 进程相关的设置
# 主进程
master = true
# 最大数量的工作进程
processes = 10 http = :5000
# 设置socket的权限
chmod-socket = 666
# 退出的时候是否清理环境
vacuum = true
退出虚拟环境 : deactivate
或者exit
依赖环境安装
yum install -y gcc* pcre-devel openssl-devel
运行
uwsgi --ini uwsgi.ini
关闭uwsgi
pkill -f uwsgi -9
** 后台运行uwsgi **
uwsgi -d --ini uwsgi.ini
检查是否可行
在浏览器中访问http://ip地址:5000,如果能够访问
到页面(可能没有静态文件)说明uwsgi配置没有问题。
2-8. 安装和配置nginx
nginx介绍:
虽然uwsgi可以正常的部署我们的项目了。但我们还是依然要采用nginx来作为web服务器。使用nginx来作为web
服务器有以下好处:
- uwsgi对静态文件资源处理并不好,包括响应速度,缓存等。
- nginx作为专业的web服务器,暴露在公网上会比uwsgi更加安全一点。
- 运维起来更加方便。比如要将某些IP写入黑名单,nginx可以非常方便的写进去。而uwsgi可能还要写一大段代码才能实现。
1.安装:
yum install nginx
2.nginx的简单操作命名
- 启动:
systemctl start nginx
- 关闭:
systemctl stop nginx
- 重启:
systemctl restart nginx
3.添加配置文件
在/etc/nginx/conf.d
目录下,新建一个文件,叫做bbs.conf,然后将以下代码粘贴进去:
upstream bbs{
server 127.0.0.1:5000; }
# 配置服务器 server {
# 监听的端口号
listen 80;
# 域名
server_name 47.xxx.xxx.30;
charset utf-8;
# 最大的文件上传尺寸
client_max_body_size 75M;
# 静态文件访问的url
location /static {
# 静态文件地址
alias /root/flask-project/bbs/static;
}
# 最后,发送所有非静态文件请求到flask服务器
location / {
uwsgi_pass 127.0.0.1:5000;
# uwsgi_params文件地址
include /etc/nginx/uwsgi_params;
}
}
写完配置文件后,为了测试配置文件是否设置成功,运行命令:service nginx configtest,如果不报错,说明成
功。 每次修改完了配置文件,都要记得运行systemctl start nginx。
补充:如果没有conf.d文件,可参考:
https://blog.csdn.net/qq_39377418/article/details/104548107
tips:
当出现bash时,需要设置环境变量
方法:
vim /etc/profile
在最后一行输入:
export PATH="$PATH:/需要添加的路径"
在执行
source /etc/profile
2-9 nginx配置ssl
-
准备:
SSL证书文件(可向域名申请免费的ssl域名证书):- 1_cloud.tencent.com_bundle.crt 证书文件
- 2_cloud.tencent.com.key 私钥文件
-
cd etc\nginx\
进入nginx目录 将两个证书放入 -
进入自己的nginx配置文件,按如下加入ssl
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name cloud.tencent.com;
#证书文件名称
ssl_certificate 1_cloud.tencent.com_bundle.crt;
#私钥文件名称
ssl_certificate_key 2_cloud.tencent.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
root /var/www/cloud.tencent.com;
index index.html index.htm;
}
}
2-10 部分nginx配置 无法访问,400 badrequest referer错误
按如下配置nginx [在server下]
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
python工程项目,用后台启动 输入log日志文件
nohup python -u app.py > ../nohup.log 2>&1 &
关闭后台python项目:
ps -ef | grep 文件名
查询进程号
kill -9 进程号
关闭该进程号的项目
2-11 SSL的文件转pem
确认本地安装了openssl
crt转pem:
openssl x509 -in 要转换的文件.crt -out 被转换成的命名.pem
加粗样式
openssl rsa -in 要转换的文件.key -out 被转成的文件命名.pem