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使用szrz命令来发送和接受文件,具体教程参考[这里]。

为了更高效率的部署本地文件到服务器我们需要用 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建站的其他可能性]


Powered by Aodabo Copyright © 2021.

Zhiyuan Yang. All rights reserved.

豫ICP备2020036600号