部署hello world到阿里云服务器

基于ubuntu 16.04系统(阿里云实例),使用 Gunicorn + Nginx 进行布署,云服务器为阿里云
不要觉得部署很难,一步步的做就可以,要是哪里有了意外就上网查一下,基本你能碰到的问题都有人给出解决方案了。

阿里云的配置

你的阿里云服务器会有一个实例,需要做一些配置

  1. 登录阿里云
    如果忘了你的密码或者用户名,就给阿里云的客服打电话吧,他会给你安排的明明白白的。
  2. 点击控制台
    部署hello world到阿里云服务器
  3. 找到你的实例(如果你之前买好了,注意你在哪个区)
    部署hello world到阿里云服务器
  4. 配置安全组
    我们部署的时候,nginx会用到80端口,gunicorn会用到5000端口,所以需要提前配置一下
    部署hello world到阿里云服务器
    部署hello world到阿里云服务器
    部署hello world到阿里云服务器
    部署hello world到阿里云服务器
    按照这个格式把80和5000端口配置好

在自己的虚拟机上搭建一个小项目

系统ubantu16.04(虚拟机),IDE:pycharm
新建一个虚拟环境,写个小项目(比如hello world)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':
    app.run()

gunicorn

搭建好以后跑一下,没问题的话就可以。但是这是基于falsk自带的web服务器,所以在阿里云上要用gunicorn来代替,它能让你的程序跑起来。

  • 安装
pip install gunicorn

然后在你的项目下新建一个gunicorn.py文件,来进行一些配置
部署hello world到阿里云服务器
通过命令行启动它

gunicorn -c gunicorn.py 运行文件名:flask实例名
例:
gunicorn -c gunicorn.py love:app
(我的是love.py,实例app)

你可以通过下面红色的命令来查看gunicorn的启动情况,以及如何退出
部署hello world到阿里云服务器
运行之后你会发现他已经在后台运行了,不会占用命令行。通过浏览器输入你绑定的端口(127.0.0.1:5000)应该可以看到运行结果

nginx

主要通过它做一些反向代理和负载均衡的工作,这里我们只需要它做反向代理,把请求转发到gunicorn,你需要安装它并编辑配置文件

  • 安装
$ sudo apt-get install nginx

# 可能会需要输入你的虚拟机开机密码
/etc/init.d/nginx start #启动
/etc/init.d/nginx stop  #停止

编辑文件: /etc/nginx/sites-available/default

# 如果是多台服务器的话,则在此配置,并修改 location 节点下面的 proxy_pass 
upstream flask {
        server 127.0.0.1:5000;
        server 127.0.0.1:5001;
}
# 上面这一步可以不用做

server {
        # 监听80端口
        listen 80 default_server;
        listen [::]:80 default_server;
		# 可以注释掉下面这两句
        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # 请求转发到gunicorn服务器
                proxy_pass http://127.0.0.1:5000;
                # 请求转发到多个gunicorn服务器
                # proxy_pass http://flask;
                # 设置请求头,并将头信息传递给服务器端 
                proxy_set_header Host $host;
                # 设置请求头,传递原始请求ip给 gunicorn 服务器
                proxy_set_header X-Real-IP $remote_addr;
        }
}

编辑好了以后开启它,然后去浏览器输入127.0.0.1,(默认就是80端口)看看是不是可以了。

配置环境

下面需要把你的程序所在的环境在远程阿里云上安装一下

利用命令行进行远程服务器登录

ssh 用户名@ip地址
例:
ssh [email protected]

你可以在 更多 里修改你的密码,远程登录需要使用,但是你需要使用比较麻烦的那个,而不是简单的6位数的那个。

  • 先更新 apt 相关源
sudo apt-get update
  • 安装虚拟环境
pip install virtualenv
pip install virtualenvwrapper
# 如果出错
locale.Error: unsupported locale setting
解决:语言设置问题 
export LC_ALL=C
  • 使得安装的virtualenvwrapper生效,编辑~/.bashrc文件,内容如下:
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh
  • 使编辑后的文件生效
source ~/.bashrc

然后创建一个虚拟环境吧

mkvirtualenv -p python3 虚拟环境名称
例 :
mkvirtualenv -p python3 py3_flask

接下来把你的程序所用到的包都安装到阿里云的虚拟环境中
在pycharm的终端切换到你的项目的根目录
把包的名字导入到一个requirements.txt文件中
你的项目目录下会多了一个requirements.txt,那里有你项目所需要的包

pip freeze > requirements.txt
# 查看一下,然后把其中的pkg-resources删除掉,它并不会有什么影响

然后打开一个新的终端,进入到你的项目目录的上一级,比如你在桌面建立的项目,那就进入到桌面,然后把项目远程拷贝到阿里云

scp -r 本地文件路径 [email protected]公网ip:远程保存路径

来到阿里云,确保你当前是在你创建的虚拟环境中,然后进入到你拷贝的项目中执行:

pip install -r requirements.txt
# 如果出现错误 pkg-resources找不到,在你的requirements.txt中把它删掉就可以

然后按照之前的做法,把nginx在阿里云上安装,编辑配置文件
最后,开启gunicorn, 开启nginx
通过公网ip访问一下看看是否成功了
如果没有,不要灰心,多琢磨一下,睡一觉说不定你就知道哪里需要改进一下了!