搭建簡單的nginx+uwsgi服務(wù)
附錄(uwsgi ini文件內(nèi)容詳解)
客戶端發(fā)送一個http請求,被nginx服務(wù)器接收,nginx服務(wù)器將請求轉(zhuǎn)發(fā)給uwsgi,uwsgi將請求轉(zhuǎn)發(fā)給實現(xiàn)uwsgi協(xié)議的應(yīng)用程序,或可以自己處理用戶請求信息并反饋結(jié)果(本次搭建服務(wù)為uwsgi自己處理請求)
環(huán)境為CentOS6.8
1、將Python升級到2.7版本,默認該環(huán)境中為2.6
從網(wǎng)上下載Python2.7相應(yīng)的安裝包
在本地安裝編譯配置時所需的一些依賴包
yum groupinstall -y "Development tools"
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
編譯安裝Python2.7,本次搭建安裝到了/opt/目錄下
mkdir /opt/python
./configure --prefix=/opt/python
make &&make install
將系統(tǒng)中原有的Python替換掉,原有Python在/usr/bin下
mv /usr/bin/python /usr/bin/python.old 將原有Python重命名使其失效
rm -f /usr/bin/python-config 刪除系統(tǒng)默認的python-config軟鏈接(沒有該文件可忽略)
ln -s /opt/python/bin/python /usr/bin/python 給新裝的Python創(chuàng)建軟連接
ln -s /opt/python/bin/python-config /usr/bin/python-config 給新裝的Python創(chuàng)建軟連接
此時已完成Python2.7的安裝
python --version 查看是否已顯示新版本
注:由于原環(huán)境中Python2.6被替換,會導(dǎo)致一些依賴于原Python2.6的程序無法使用(如yum),這是可做如下更改
vi /usr/bin/yum 修改第一行內(nèi)容
#!/usr/bin/python? ? -------> #!/usr/bin/python2.6
2、安裝setuptools
可從網(wǎng)上下載setuptools源碼包,解壓該包并進入
python setup.py build
python setup.py install
這時已經(jīng)安裝setuptools到/opt/python/bin下,該目錄下出現(xiàn)easy_install
3、通過easy_install安裝pip
需要通過pip來安裝一些Python環(huán)境下的軟件
/opt/python/bin/easy_install pip
4、通過pip來安裝virtualenv和uwsgi
virtualenv可以提供多個虛擬的不同的Python環(huán)境,可以通過切換不同的虛擬環(huán)境來使用不同版本或不同搭配的Python環(huán)境
pip install virtualenv
安裝uwsgi
pip install uwsgi
安裝的virtualenv和uwsgi也同樣在/opt/python/bin下
5、通過virtualenv創(chuàng)建一個虛擬Python環(huán)境,在此環(huán)境下搭建本次項目
創(chuàng)建新的虛擬環(huán)境,放在/opt/uwsgi下,命名為env
mkdir /opt/uwsgi
cd /opt/uwsgi
virtualenv env 該命令可在本目錄下創(chuàng)建名為env的新虛擬Python環(huán)境,可加--no-site-packages參數(shù)來創(chuàng)建空白的全新
環(huán)境,本次直接執(zhí)行該命令會將本地的Python環(huán)境拷貝一份到創(chuàng)建的env環(huán)境中
這時可以進入/opt/uwsgi/env下,可以看到新生成了一些文件
6、進入env虛擬環(huán)境,并創(chuàng)建測試頁
進入env虛擬環(huán)境
source /opt/uwsgi/env/bin/activate 這時會看到命令行最頭部出現(xiàn)(env),表明已進入env環(huán)境
可以一個存放項目文件的目錄,本次為存放測試文件的目錄projects
mkdir /opt/uwsgi/projects
cd /opt/uwsgi/projects
在該目錄下創(chuàng)建一個測試腳本test.py
vi test.py 內(nèi)容如下:(一定要注意格式不能變,否則不能用)
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return 'hello world'
測試uwsgi可用性
/opt/uwsgi/env/bin/uwsgi --http :9090 --wsgi-file test.py 開放一個9090端口來測試uwsgi,可以用同網(wǎng)段的
瀏覽器測試,如無法訪問可關(guān)閉防火墻,瀏覽器應(yīng)顯示hello world
7、編寫.ini來啟動uwsgi
.ini文件相當于uwsgi的配置文件,啟動uwsgi時可以指定該文件來指定uwsgi的運行狀態(tài)
本次在/opt/uwsgi/file_ini下創(chuàng)建test.ini,來作為uwsgi的測試配置文件
mkdir /opt/uwsgi/file_ini
vi test.ini 內(nèi)容如下:
[uwsgi]
socket = 127.0.0.1:5000? #socket是與nginx相關(guān)聯(lián)時設(shè)置的參數(shù),若要直接處理瀏覽器請求則改成http
processes = 4?
threads = 2
master = true
chdir = /opt/uwsgi/projects/
wsgi-file = test.py
8、測試通過test.ini來啟動uwsgi
uwsgi --ini test.ini (-d ./uwsgi.log --pidfile=uwsgi.pid) 該命令為打開5000端口來監(jiān)測
http請求,并通過制定.ini文件來啟動uwsgi,注意--ini后跟.ini文件的路徑,括號內(nèi)的參數(shù)為生成log日志文件
和存放pid號的文件,以方便殺死該進程,若不加括號內(nèi)的參數(shù)則執(zhí)行命令后會占用命令行窗口來運行uwsgi
9、安裝并配置nginx來作為前端進程來監(jiān)測客戶請求并將請求轉(zhuǎn)發(fā)給uwsgi
在/opt/下創(chuàng)建nginx目錄來安裝nginx
安裝完成后進入/opt/nginx/conf,修改nginx.conf文件,該文件為啟動nginx時的的配置文件
vi nginx.conf
worker_processes? 1;
events {
worker_connections? 1024;
}
http {
server {
listen? ? ? 80;
server_name? localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
}
}
改配置文件中寫明監(jiān)測http的80端口,并將請求轉(zhuǎn)發(fā)給本地的5000端口,而5000端口即為本地uwsgi監(jiān)測的端口
這時只要用瀏覽器測試訪問本機的80端口即可得到hello world
附錄:
uwsgi ini文件內(nèi)容詳解(部分參數(shù))
[uwsgi]
uid = nginx #使用nginx用戶和組
gid = nginx
chdir = /webser/www/demosite #指定項目目錄,在配置多站點時,不要啟用
module = demosite.wsgi #加載demosite/wsgi.py這個模塊,在配置多站點時,不要啟用
master = true #啟動主進程。
processes = 2 #啟動2個工作進程
listen = 120 #設(shè)置socket的監(jiān)聽隊列大小(默認:100)
socket = /test/myapp.sock #指定socket文件,也可以指定為127.0.0.1:9000,這樣就會監(jiān)聽到網(wǎng)絡(luò)套接字
pidfile = /var/run/uwsgi.pid #指定pid文件
vacuum = true #當服務(wù)器退出的時候自動刪除unix socket文件和pid文件。
enable-threads = true #允許用內(nèi)嵌的語言啟動線程。這將允許你在app程序中產(chǎn)生一個子線程
buffer-size = 32768 #設(shè)置用于uwsgi包解析的內(nèi)部緩存區(qū)大小為64k。默認是4k。
reload-mercy = 8 #設(shè)置在平滑的重啟(直到接收到的請求處理完才重啟)一個工作子進程中,等待這個工作結(jié)束的最長秒數(shù)。這個配置會使在平滑地重啟工作子進程中,如果工作進程結(jié)束時間超過了8秒就會被強行結(jié)束(忽略之前已經(jīng)接收到的請求而直接結(jié)束)
max-requests = 5000 #為每個工作進程設(shè)置請求數(shù)的上限。當一個工作進程處理的請求數(shù)達到這個值,那么該工作進程就會被回收重用(重啟)。你可以使用這個選項來默默地對抗內(nèi)存泄漏
limit-as = 256 #通過使用POSIX/UNIX的setrlimit()函數(shù)來限制每個uWSGI進程的虛擬內(nèi)存使用數(shù)。這個配置會限制uWSGI的進程占用虛擬內(nèi)存不超過256M。如果虛擬內(nèi)存已經(jīng)達到256M,并繼續(xù)申請?zhí)摂M內(nèi)存則會使程序報內(nèi)存錯誤,本次的http請求將返回500錯誤。
harakiri = 60 #一個請求花費的時間超過了這個harakiri超時時間,那么這個請求都會被丟棄,并且當前處理這個請求的工作進程會被回收再利用(即重啟)
daemonize = /var/log/myapp_uwsgi.log # 使進程在后臺運行,并將日志打到指定的日志文件或者udp服務(wù)器