Python 网站开发(15) -- 部署网站到远程服务器
部署网站到远程服务器
下一步就要将我们的网站部署到Linux服务器上。可以选国内的阿里云,腾讯云等服务器。推荐Amazon的 AWS EC 2 虚拟机,只要申请就可以免费使用一年。在本地部署的话安装虚拟机即可,VMware, VirtualBox 等都可以。我们拿AWS的服务器来部署网站。
服务器的操作系统请选择最新版的Ubuntu系统。服务器准备完成后,我们就可以从本地通过ssh连接远程服务器了。请下载服务器的秘钥xxxxxx.pem
, 复制服务器实例的IDubuntu@xx.xx.xx.xx
。然后可以使用PuTTY, SecureCRT等工具进行连接,具体教程请参考aws官方指南或自行百度(例如:ssh连接aws ec2服务器)。注意pem文件的的权限要改为 400:chmod 400 /path/my-key-pair.pem
。
连接上了远程服务器后,我们就可以完全用Linux命令行来控制操作服务器了。一些简单基本的Linux命令(主要会用到cd, ls, mkdir, rm, cp, mv)请参考[这里]。
首先我们在服务器上安装必要的一些服务:
$ sudo apt-get install nginx supervisor python3 mysql-server
- Nginx:高性能Web服务器+负责反向代理;
- Supervisor:监控服务进程的工具,可以随系统启动而启动服务,它还时刻监控服务进程,如果服务进程意外退出,Supervisor可以自动重启服务。
- MySQL:数据库服务。
然后安装Python需要的第三方库:
$ sudo pip3 install jinja2 aiomysql aiohttp markdown
在服务器上创建目录/srv/awesome/
以及相应的子目录。
/
+- srv/
+- awesome/ <-- Web App根目录
+- www/ <-- 存放Python源码
| +- static/ <-- 存放静态资源文件
+- log/ <-- 存放log
在服务器上初始化MySQL数据库,把数据库初始化脚本schema.sql
复制到服务器上执行:
$ mysql -u root -p < schema.sql
上传文件到远程服务器可以安装Irzsz
使用sz
和rz
命令来发送和接受文件,具体教程参考[这里]。
为了更高效率的部署本地文件到服务器我们需要用 Fabric 一个自动化部署工具。请安装在本地:
$ pip install fabric
然后将部署脚本fabfile.py
放在本地awesome-website
目录下,与www
平级 (Windows环境下请参考[网友经验])。以下fabfile.py
已不适用最新的fabric版本(>=2.0), 最新版fabric配置请移步这里[FABRIC2 DEPLOY TUTORIAL -- FABRIC2 部署教程]。以下代码只适用于fabric1.x:
import os, re
from datetime import datetime
# 导入Fabric API:
from fabric.api import *
# 服务器登录用户名和秘钥:
env.hosts = ['ubuntu@xxxx.xxxx.compute.amazonaws.com']
env.key_filename = '/xxx/xxx/awsKeyPair.pem'
# 服务器MySQL用户名和口令:
db_user = 'root'
db_password = 'MySQL的root用户密码'
_TAR_FILE = 'dist-awesome.tar.gz'
_REMOTE_TMP_TAR = '/tmp/%s' % _TAR_FILE
_REMOTE_BASE_DIR = '/srv/awesome'
def deploy():
newdir = 'www-%s' % datetime.now().strftime('%y-%m-%d_%H.%M.%S')
# 删除已有的tar文件:
run('rm -f %s' % _REMOTE_TMP_TAR)
# 上传新的tar文件:
put('dist/%s' % _TAR_FILE, _REMOTE_TMP_TAR)
# 创建新目录:
with cd(_REMOTE_BASE_DIR):
sudo('mkdir %s' % newdir)
# 解压到新目录:
with cd('%s/%s' % (_REMOTE_BASE_DIR, newdir)):
sudo('tar -xzvf %s' % _REMOTE_TMP_TAR)
# 需要添加权限浏览器才能访问
sudo('chmod -R 775 static/')
sudo('chmod 775 favicon.ico')
# # 由于app.py的文件格式有问题,转换一下
# run('app.py')
# 重置软链接:
with cd(_REMOTE_BASE_DIR):
sudo('rm -rf www')
sudo('ln -s %s www' % newdir)
sudo('chown ubuntu:ubuntu www')
sudo('chown -R ubuntu:ubuntu %s' % newdir)
# 重启Python服务和nginx服务器:
with settings(warn_only=True):
sudo('supervisorctl stop awesome')
sudo('supervisorctl start awesome')
sudo('/etc/init.d/nginx reload')
def build():
includes = ['static', 'templates', 'transwarp', 'favicon.ico', '*.py', '*.txt']
excludes = ['test', '.*', '*.pyc', '*.pyo']
local('rm -f dist/%s' % _TAR_FILE)
with lcd(os.path.join(os.path.abspath('.'), 'www')):
cmd = ['tar', '--dereference', '-czvf', '../dist/%s' % _TAR_FILE]
cmd.extend(['--exclude=\'%s\'' % ex for ex in excludes])
cmd.extend(includes)
local(' '.join(cmd))
在awesome-website
目录下运行:
$ fab build
看看是否在dist
目录下创建了dist-awesome.tar.gz
的文件。如果提示tar打包错误,请忽视不用担心。接下来使用deploy
命令将打包文件tar部署到服务器并解压,重置www
软链,重启相关服务(相关服务还未配置,重启会提示错误):
$ fab deploy
配置Supervisor
接下来我们需要编写一个Supervisor的配置文件awesome.conf
, 存放到/etc/supervisor/conf.d/
目录下:
[program:awesome]
command = /srv/awesome/www/app.py
directory = /srv/awesome/www
user = www-data
startsecs = 3
redirect_stderr = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 10
stdout_logfile = /srv/awesome/log/app.log
然后重启Supervisor后,就可以随时启动和停止Supervisor管理的服务了:
$ sudo supervisorctl reload
$ sudo supervisorctl start awesome
$ sudo supervisorctl status
配置Nginx
Supervisor只负责运行app.py
,我们还需要配置Nginx。如果申请了域名,nginx可以将域名解析到服务器,以下设置包含了域名的解析。(域名绑定服务器的教程请自行百度,需要给aws实例再申请一个免费固定IP地址—Elastic IP)把配置文件awesome
放到/etc/nginx/sites-available/
目录下:
server {
# 监听80端口,作用是将用户http的请求转发到https
listen 80;
# 绑定的域名, 换成你注册的域名,将带www和不带www都写上,以防疏漏
server_name aodabo.tech www.aodabo.tech;
rewrite ^(.*)$ https://aodabo.tech permanent;
}
# 监听443端口
server {
listen 443;
server_name aodabo.tech www.aodabo.tech;
ssl on;
#ssl认证秘钥,填写两个秘钥文件在服务器上的绝对路径
ssl_certificate /etc/nginx/cert/xxxxxxxx.pem;
ssl_certificate_key /etc/nginx/cert/xxxxxxxx.key;
#以下的设置要根据你域名供应商提供的设置信息进行更换,此处用的是阿里云域名的设置
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
root /srv/awesome/www;
access_log /srv/awesome/log/access_log;
error_log /srv/awesome/log/error_log;
client_max_body_size 1m;
gzip on;
gzip_min_length 1024;
gzip_buffers 4 8k;
gzip_types text/css application/x-javascript application/json;
sendfile on;
location /favicon.ico {
root /srv/awesome/www;
}
location ~ ^\/static\/.*$ {
root /srv/awesome/www;
}
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
然后在/etc/nginx/sites-enabled/
目录下创建软链接:
$ cd /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/awesome .
让Nginx重新加载配置文件,网站就可以正常运行:
$ sudo /etc/init.d/nginx reload
如果有任何错误,都可以在/srv/awesome/log
下查找Nginx和App本身的log。如果Supervisor启动时报错,可以在/var/log/supervisor
下查看Supervisor的log。
至此,如果顺利,在浏览器打开你的域名地址,或者服务器的ip地址就可以看见你的网站啦!
[上一章:Python 网站开发(14) -- 管理页面]
[下一章:Python 网站开发(16) -- Python建站的其他可能性]