flask是一個(gè)輕量級(jí)的基于Werkzeug和Jinja2模板引擎的Web應(yīng)用框架。gunicorn能與很多Web框架兼容,執(zhí)行起來很簡(jiǎn)單,資源消耗很少,并且運(yùn)行速度很快。
flask+gunicorn+nginx部署在公網(wǎng)IP為x.x.x.x的服務(wù)器上。
flask需要部署在Python3的環(huán)境中。
gunicorn需要安裝在virtualenv環(huán)境中。
nginx安裝
第一步,安裝編譯工具及庫(kù)文件。
命令:yum -y install make zlib zlib-devel gcc-c++ libtool ?openssl openssl-devel pcre pcre-devel
第二步,安裝Nginx。
# 下載Nginx安裝包
命令:cd /usr/local/src/
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解壓Nginx安裝包
命令:tar zxvf nginx-1.18.0.tar.gz
# 編譯安裝Nginx
命令:cd nginx-1.18.0
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-threads \
--with-stream \
--with-stream_ssl_module
make && make install
# 查看nginx版本
命令:/usr/sbin/nginx -v
或 ???/usr/sbin/nginx -V
若結(jié)果顯示“nginx version: nginx-1.18.0”,則nginx安裝完成。
nginx配置
第一步,創(chuàng)建 Nginx 運(yùn)行使用的用戶nginx。
命令:useradd -s /sbin/nologin -M nginx
第二步,修改nginx.conf配置文件。
nginx.conf路徑為/etc/nginx/nginx.conf。nginx.conf內(nèi)容如下:
user nginx nginx; ?#用戶名設(shè)置為剛剛創(chuàng)建的用戶名
worker_processes ?4; #允許生成的進(jìn)程數(shù),默認(rèn)為1
worker_cpu_affinity 0001 0010 0100 1000;
error_log ?/var/log/nginx/error.log info; #日志位置和級(jí)別
pid ?????/var/run/nginx.pid; #指定nginx進(jìn)程運(yùn)行文件存放地址
worker_rlimit_nofile 102400; #最大連接數(shù),默認(rèn)為512
events {
????use epoll; #事件驅(qū)動(dòng)模型
????worker_connections 102400; #最大連接數(shù),默認(rèn)為512
????accept_mutex off; #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on
????multi_accept on; #設(shè)置一個(gè)進(jìn)程是否同時(shí)接受多個(gè)網(wǎng)絡(luò)連接,默認(rèn)為off
}
http
{
?? include mime.types;
?? default_type application/octet-stream;
...
?? server
?? {
????????listen 80; ?#監(jiān)聽端口
server_name localhost; ?#域名,當(dāng)前IP地址
#charset utf-8; ?#編碼改為utf-8
???? location / {
???????? root ??html;
???????? index ?index.html index.htm;
????? }
...
}
第三步,檢查配置文件nginx.conf的正確性。
命令:/usr/sbin/nginx -t
若結(jié)果顯示“nginx: [emerg] mkdir() "/var/tmp/nginx/client" failed (2: No such file or directory) ?nginx: configuration file /etc/nginx/nginx.conf test failed”,則說明服務(wù)無法啟動(dòng)??梢允褂妹睢癿kdir -p /var/tmp/nginx”創(chuàng)建目錄,然后再次運(yùn)行命令“/usr/sbin/nginx -t”就可以了。
若結(jié)果顯示“nginx: configuration file /etc/nginx/nginx.conf test is successful”,則說明nginx安裝和配置成功。
nginx啟動(dòng)和訪問站點(diǎn)
第一步,啟動(dòng)nginx。
命令:/usr/sbin/nginx
第二步,檢查是否已經(jīng)啟動(dòng)。(查看是否有進(jìn)程)
命令:ps -ef | grep nginx
結(jié)果的第一行顯示“nginx:master process”,nginx已經(jīng)啟動(dòng)。
注意:nginx:master process后面有一個(gè)路徑,這就是nginx的安裝路徑。
第三步,訪問站點(diǎn)。
從瀏覽器訪問已經(jīng)配置好的站點(diǎn)IP,如果頁(yè)面顯示“Welcome to nginx!”,則說明Nginx已經(jīng)安裝及配置好了。
nginx關(guān)閉和重啟
第一步,關(guān)閉nginx。
命令:/usr/sbin/nginx -s stop
第二步,配置文件修改后,需要指定配置文件進(jìn)行重啟。
如果nginx服務(wù)已經(jīng)停止,那就需要把nginx服務(wù)啟動(dòng)。
命令:/usr/sbin/nginx ?-c /etc/nginx/nginx.conf
重啟nginx服務(wù)必須是在nginx服務(wù)已經(jīng)啟動(dòng)的情況下進(jìn)行,因?yàn)檫@時(shí),/var/run中存在nginx.pid文件。
命令:/usr/sbin/nginx ?-s ?reload
不進(jìn)入nginx根目錄即可進(jìn)行相應(yīng)的操作
第一種方法:
第一步,找到nginx所在的安裝目錄/usr/local/nginx/sbin,這個(gè)目錄下有一個(gè)名為nginx的文件。
第二步,創(chuàng)建一個(gè)軟鏈接放在全局目錄中。相當(dāng)于在全局環(huán)境中設(shè)置了一個(gè)文件指向依賴的環(huán)境目錄中。
命令:cd /usr/local/bin/
ln -s /usr/sbin/nginx nginx
現(xiàn)在不進(jìn)入nginx根目錄輸入命令,不會(huì)再提示command not found。
第二種方法:
第一步,新建nginx啟動(dòng)腳本代碼。
在文件夾/etc/init.d中新建名為nginx的文件,然后寫入下面代碼成為腳本文件。代碼如下:
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# ?????????????It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/sbin/nginx
nginx_config=/etc/nginx/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
???echo "nginx already running...."
???exit 1
fi
???echo -n $"Starting $prog: "
???daemon $nginxd -c ${nginx_config}
???RETVAL=$?
???echo
???[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
???return $RETVAL
}
# Stop nginx daemons functions.
stop() {
????????echo -n $"Stopping $prog: "
????????killproc $nginxd
????????RETVAL=$?
????????echo
????????[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
????echo -n $"Reloading $prog: "
????#kill -HUP `cat ${nginx_pid}`
????killproc $nginxd -HUP
????RETVAL=$?
????echo
}
# See how we were called.
case "$1" in
start)
????????start
????????;;
stop)
????????stop
????????;;
reload)
????????reload
????????;;
restart)
????????stop
????????start
????????;;
status)
????????status $prog
????????RETVAL=$?
????????;;
*)
????????echo $"Usage: $prog {start|stop|restart|reload|status|help}"
????????exit 1
esac
exit $RETVAL
第二步,給予/etc/init.d/nginx文件權(quán)限。
命令:chmod +x /etc/init.d/nginx
# 設(shè)置開機(jī)自啟
命令:chkconfig --add nginx
chkconfig nginx on
# 檢查nginx命令
命令:service nginx
Usage: nginx {start|stop|restart|reload|status|help}
第三步,檢查一下腳本是否有用。
命令:/sbin/chkconfig nginx on
sudo /sbin/chkconfig --list nginx
如果結(jié)果顯示“nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off”,則說明腳本文件有用。
第四步,服務(wù)器重啟后,查看nginx是否成功自動(dòng)啟動(dòng)。
與“nginx啟動(dòng)和訪問站點(diǎn)”中的第二步和第三步一樣操作。
命令:shutdown -r now ?#立刻重啟
或 ???reboot ??????????#立刻重啟
或 ???init 6 ??????????#立刻重啟
或 ???shutdown -r 10 ??#過10分鐘自動(dòng)重啟
第五步,nginx啟動(dòng)、關(guān)閉以及重啟命令。
命令:ps -ef | grep nginx
systemctl start nginx
systemctl stop nginx
systemctl reload nginx
或
service nginx start
service nginx stop
service nginx reload
Python-3.9.5安裝
第一步,檢查L(zhǎng)inux系統(tǒng)是否自帶Python。
命令:python --version
??
第二步,安裝依賴包。
命令:yum -y install bzip2-devel gcc make ncurses-devel openssl-devel readline-devel sqlite-devel tk-devel zlib-devel
第三步,下載Python-3.9.5安裝包。
命令:cd /usr/local/src
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
第四步,解壓Python-3.9.5安裝包。
命令:cd /usr/local/src
tar -xvJf Python-3.9.5.tar.xz
第五步,編譯安裝Python-3.9.5。
命令:cd /usr/local/src/Python-3.9.5
./configure prefix=/usr/local/Python-3.9.5
make && make install
若結(jié)果顯示下圖的內(nèi)容,則說明Python-3.9.5編譯安裝成功。
??
第六步,配置Python環(huán)境變量。
在配置文件/etc/profile中添加下面的代碼:
export PATH=$PATH:/usr/local/Python-3.9.5/bin
# 使profile配置立即生效
命令:source /etc/profile
# 查看Python版本
命令:python3.9 -V
若結(jié)果顯示“Python 3.9.5”,則說明Python-3.9.5安裝成功。
pip安裝
第一步,檢查Python3是否自帶pip。
命令:pip3 --version
若結(jié)果顯示“pip 9.0.3”,則說明Python3自帶pip。
??
第二步,更新pip。
命令:sudo pip3 install --upgrade pip
若結(jié)果顯示“Successfully installed pip-21.1.1”,則說明pip更新成功。
第三步,查看更新的pip版本。
命令:python3.9 -m pip -V
??
virtualenv安裝以及工作原理
virtualenv如何創(chuàng)建“獨(dú)立”的Python運(yùn)行環(huán)境,原理很簡(jiǎn)單,就是把安裝的Python復(fù)制一份到virtualenv環(huán)境,然后進(jìn)入一個(gè)virtualenv環(huán)境,virtualenv會(huì)修改相關(guān)的環(huán)境變量,這樣就會(huì)讓python和pip指向當(dāng)前的virtualenv環(huán)境。
第一步,安裝virtualenv和virtualenvwrapper。
命令:pip3 install virtualenv virtualenvwrapper
若結(jié)果顯示“Successfully”,則說明virtualenv和virtualenvwrapper安裝成功。
??
第二步,創(chuàng)建獨(dú)立運(yùn)行環(huán)境。
# 新建項(xiàng)目目錄
命令:mkdir /usr/local/Myproject
# 創(chuàng)建獨(dú)立第三方包的運(yùn)行環(huán)境VENV
命令:cd /usr/local/Myproject
virtualenv VENV
第三步,設(shè)置環(huán)境變量。
在文件~/.bash_profile中添加下面兩行代碼:
export WORKON_HOME=/usr/local/Myproject/VENV
source /usr/local/bin/virtualenvwrapper.sh
# 使環(huán)境變量生效
命令:source ~/.bash_profile
??
第四步,進(jìn)入并激活虛擬環(huán)境(VENV)Myproject。
命令:cd /usr/local/Myproject
source VENV/bin/activate
參數(shù)說明:
VENV/bin/activate:安裝虛擬環(huán)境下的bin目錄下的activate。
第五步,在(VENV)Myproject中創(chuàng)建、列出和切換虛擬環(huán)境。
# 創(chuàng)建虛擬環(huán)境格式:mkvirtualenv [虛擬環(huán)境名稱]
命令:mkvirtualenv venv
mkvirtualenv venv1
mkvirtualenv venv2
# 列出虛擬環(huán)境
命令:lsvirtualenv
# 切換虛擬環(huán)境格式:workon [虛擬環(huán)境名稱]
命令:workon venv1
workon venv2
workon venv
?
第六步,在(VENV)Myproject中檢查環(huán)境變量PATH確認(rèn)是否正確激活了虛擬環(huán)境VENV。
命令:workon venv
echo $PATH
workon venv1
echo $PATH
workon venv2
echo $PATH
若結(jié)果顯示下圖中的內(nèi)容,則說明正確激活了虛擬環(huán)境VENV。
??
第七步,在(VENV)Myproject中安裝flask。
# 通過pip3安裝的包都會(huì)安裝到虛擬環(huán)境VENV中
命令:workon venv
pip3 install flask
若結(jié)果顯示“Successfully”,則說明flask安裝成功。
??
workon venv1
pip3 install flask
若結(jié)果顯示“Successfully”,則說明flask安裝成功。
??
workon venv2
pip3 install flask
若結(jié)果顯示“Successfully”,則說明flask安裝成功。
??
第八步,在(VENV)Myproject中檢查當(dāng)前的python3和pip3的路徑。
命令:workon venv
which python3
which pip3
workon venv1
which python3
which pip3
workon venv2
which python3
which pip3
??
第九步,退出虛擬環(huán)境(VENV)Myproject。
命令:deactivate
Gunicorn安裝
第一步,在/usr/local/Myproject目錄下新建wsgi.py文件。
命令:vim /usr/local/Myproject/wsgi.py
在wsgi.py文件中添加下面的代碼:
# wsgi.py
from flask import Flask
def create_app():
???# 這個(gè)工廠方法可以從原有的`__init__.py`或者其它地方引入
???app = Flask(__name__)
???return app
application = create_app()
if __name__ == '__main__':
application.run()
第二步,進(jìn)入并激活虛擬環(huán)境(VENV)Myproject。
命令:cd /usr/local/Myproject
source VENV/bin/activate
第三步,在(VENV)Myproject中安裝Gunicorn。
# 通過pip3安裝的包都會(huì)安裝到虛擬環(huán)境VENV中
命令:workon venv
pip3 install gunicorn
workon venv1
pip3 install gunicorn
workon venv2
pip3 install gunicorn
若結(jié)果顯示“Successfully installed gunicorn-20.1.0”,則說明gunicorn安裝成功。
第四步,在(VENV)Myproject中運(yùn)行Gunicorn。
命令:workon venv
gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
workon venv1
gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
workon venv2
gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
deactivate
只要gunicorn運(yùn)行成功,就會(huì)具體host一個(gè)flask實(shí)例。
參數(shù)注釋:
wsgi:application參數(shù)分為兩部分:wsgi是剛剛新建的起引導(dǎo)作用的python文件的名稱,application是flask實(shí)例的名稱。
nginx配置
第一步,備份配置文件nginx.conf。
命令:cp -pr /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
第二步,在nginx.conf中進(jìn)行修改。
在server{}節(jié)點(diǎn)中做出下面的修改:
server {
listen 80;
# 服務(wù)器的外部域名,使用地址也可以
??????? server_name localhost;
location / {
?????????? # 指向gunicorn host的服務(wù)地址
?????????????? proxy_pass http://127.0.0.1:8080;
?????????????? proxy_set_header Host $host;
?????????????? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
??????? }
}
第三步,重啟nginx。
命令:nginx -t
ps -ef | grep nginx
service nginx reload
將Gunicorn作為服務(wù)程序運(yùn)行
采用UpStart來配置flask程序作為服務(wù)程序,該服務(wù)程序在服務(wù)器啟動(dòng)時(shí)運(yùn)行。
第一步,在/etc/init/目錄下新建配置文件myflask.conf。
命令:vim /etc/init.d/myflask.conf
在myflask.conf中加入下面的代碼:
description "The myflask service"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid root
setgid www-data
# virtualenv路徑和項(xiàng)目路徑
env PATH= /usr/local/Myproject/VENV/venv/bin
env PATH= /usr/local/Myproject/VENV/venv1/bin
env PATH= /usr/local/Myproject/VENV/venv2/bin
chdir /usr/local/Myproject/
exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application
第二步,授予/etc/init.d/myflask.conf文件權(quán)限。
命令:chmod +x /etc/init.d/myflask.conf
第三步,啟動(dòng)myflask服務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-493518.html
命令:service myflask start文章來源地址http://www.zghlxwxcb.cn/news/detail-493518.html
到了這里,關(guān)于在Linux中部署Flask+Gunicorn+Nginx的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!