在阿里雲服務器上配置CentOS+Nginx+Python+Flask環境
項目運行環境
阿里雲(單核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
|
