項目運行環境
阿里云(單核CPU, 1G內存, Ubuntu 14.04 x64 帶寬1Mbps), 具體購買和ssh連接阿里云本文不做描述。
實用工具
首先進入阿里云服務器后先要升級下apt-get, 并下載所需軟件
1
2
|
sudo apt-get update sudo apt-get install vim git wget tmux |
我還會使用zsh和oh-my-zsh來替換bash
1
2
3
4
|
sudo apt-get install zsh # 終端下打以下命令 wget --no-check-certificate https: //github .com /robbyrussell/oh-my-zsh/raw/master/tools/install .sh -O - | sh |
替換bash為zsh
1
|
chsh -s /bin/zsh |
重新連接阿里云就可以看到效果, 具體主題可以根據自己喜好更改主目錄下的.zshrc即可
安裝python相關模塊
使用python的pip包管理工具
1
2
3
|
sudo apt-get install python-setuptools sudo apt-get install python-pip sudo pip install python-virtualenv |
在主目錄下創建文件夾code并把所有項目放進這個目錄里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
mkdir code # 使用virtualenv vritualenv venv # 開啟virtualenv source /venv/bin/activate # 關閉virtualenv deactivate # 在開啟virtualenv的狀態下使用pip會使用venv中的pip,也就是所有模塊都會安裝到venv中 # 如果想要安裝全局模塊就使用sudo pip # 安裝flask, 安裝到venv中 pip install flask # 兩個是不同的, 安裝到系統中 sudo pip install flask |
使用Flask
現在我們已經安裝了Flask, 現在我們寫一個小的程序來運行一下。
這里我們在一次安裝flask的相關模塊,并把他們寫入到requirements.txt這個文件中。
1
2
3
4
5
6
7
8
9
10
11
|
# 安裝flask的相關模塊 pip install -r requirements # 創建一個manage.py文件, 用作管理我們的應用, 然后創建我們的一個應用。 touch manage.py ## 創建一個叫bamboo的應用 mkdir bamboo ## 創建一個應用的文件, 接下來我們要編輯這個文件了。 touch bamboo /__init__ .py bamboo /app .py |
項目目錄結構是這樣的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/root/code/ ├── bamboo │ ├── app.py │ ├── config.py │ ├── __init__.py │ ├── static │ ├── templates │ └── views ├── gunicorn.conf ├── logs │ ├── access.log │ ├── error.log │ ├── supervisord.log │ ├── supervisor_err.log │ └── supervisor_out.log ├── manage.py ├── requirements.txt ├── run.py ├── sweep.py └── venv |
編輯bamboo/app.py和bamboo/views/main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
## app.py from flask import Flask def create_app(): app = Flask(__name__) # do something register_blueprints(app) return app # 用來注冊視圖的路由 def register_blueprints(app): from bamboo.views import main, error for i in (main, error): app.register_blueprint(i.bp) ## main.py from flask import render_template, Blueprint bp = Blueprint( 'main' , __name__) @bp .route( '/' ) @bp .route( '/index' ) def index(): return '<h1>Hello, Bamboo!</h1>' |
安裝Gunicorn
Gunicorn是一個wsgi服務器, 我們將通過它來啟動我們的web服務。
1
2
|
# 注意我們是通過pip來安裝,所以該模塊所有文件都是在venv里面 pip install gunicorn |
可以進入目錄vevn/bin下查看是否存在gunicorn命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 這里我們編輯下manage.py文件,具體文件路徑請查看上文中的目錄結構 ## manage.py from bamboo.app import create_app from flask.ext.script import Manager, Server, Shell app = create_app() manager = Manager(app) def make_shell_context(): # 用于shell使用 pass manager.add_command( 'shell' , Shell(make_context = make_shell_context)) manager.add_command( 'runserver' , Server( use_debugger = True , use_reloader = True , host = '127.0.0.1' , port = 5000 )) if __name__ = = '__main__' : manager.run() |
運行一下manage.py
1
2
3
4
5
6
|
# 不適用gunicorn運行 python manage.py runserver # 使用gunicorn 運行 # 這里需要注意一下, 冒號前面的是文件名也就是manage.py而后面的是應用的名稱。我在這里載過跟頭。因為服務器需要接受一個wsgi的應用而manager = Manager(app)不是一個wsgi應用所以報錯 gunicorn manage:app |
我們創建一個gunicorn配置文件gunicorn.conf并把他放到code目錄下
1
2
3
4
|
## gunicorn.conf workers=3 bind= '127.0.0.1:5000' |
安裝Nginx
我們通過nginx來反向代理我們的服務。
1
2
|
# 首先下載一個nginx sudo apt-get install nginx |
我們可以訪問我們的域名或IP地址,如果出現Nginx的提示就表示安裝成功了。
nginx安裝在/etc/nginx/目錄下, 我們把項目的配置文件放到/etc/nginx/sites-available/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
server{ listen 80; server_name xxx.xxx.xxx.xxx; # nginx log信息, 需要創建logs目錄 access_log /root/code/logs/access.log error_log /root/code/logs/error.log location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header HOST $host; proxy_redirect off; if (!-f $request_filename){ proxy_pass http://127.0.0.1:5000; break; } } } |
需要創建一個軟鏈接到/etc/nginx/sites-enabled/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 這里bamoo只是文件名你也可以取自己的項目名稱 ln -s /etc/nginx/sites-available/bamboo /etc/nginx/sites-enabled/bamboo # 然后檢查nginx有沒有錯誤 nginx -t # 重新啟動服務 service nginx restart 安裝Supervisor supervisor用來監控進程,并在進程掛掉的時候自動重啟它。 # 這里需要把它安裝到系統中 sudo pip install supervisor # 生成配置文件 sudo echo_supervisord_conf > /etc/supervisord .conf |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 編輯/etc/supervisord.conf,并在最后一行加入一下字段 # 這樣配置文件會將/etc/supervisor/conf.d下所有.conf結尾的都會導入進來 [include] files = /etc/supervisor/conf.d/*.conf # 在創建一個配置文件到/etc/supervisor/conf.d/bamboo.conf [program:bamboo] command=/root/code/venv/bin/gunicorn manage:app -c /root/code/gunicorn.conf directory=/root/code/ user=root autostart=true autorestart=true stdout_logfile=/root/code/logs/supervisor_out.log stderr_logfile=/root/code/logs/supervisor_err.log |
通過supervisorctl工具用來管理supervisor維護的進程
1
2
3
4
5
6
7
|
# reread來檢測修改的配置內容, update來更新 # 這樣就可以看到bamboo的process啟動了 supervisorctl reread supervisorctl update # 也可以通過supervisorctl status 查看所有的項目進程 bamboo RUNNING pid 12928, uptime 2:13:05 |
這樣我們的web服務已經啟動起來了。