提示:如果你正在linux下面(比如ubuntu系統)嘗試搭建基於python的服務器,nginx+uwsgi+webpy 。假如你在google上搜索了很多帖子,依然有許多問題。
並且某些問題在網上基本找不到答案。那建議你果斷重裝系統。從頭開始。因爲,其實這個組合挺好搭建。請看下文。
本人的版本爲
ubuntu 12.04 LTS+nginx1.2.2+UWSGI1.2.4+webpy0.36(當然0.37也可以),基本一次跑通。
最近在ubuntu12.04 lts server 下搭建nginx+uwsgi+webpy服務器,經歷許多波折,現在此版本的server和destop版本跑通,這裏一併記錄下來
server版本從http://www.ubuntu.com/download/server 下載。安裝完成後。要先安裝gcc,g++,make,webbench,apach2等基本工具.
本人蔘考的帖子如下(呵呵,IT要站在巨人的肩膀上)
nginx學習研究(一)安裝啓動及調試 :http://blog.csdn.net/apache0554/article/details/7766567
搭建UWSGI,通過簡單的webpy例子:http://www.cnblogs.com/Jerryshome/archive/2011/07/20/2111683.html
純靜態文件環境下的Nginx優化思路 :http://os.51cto.com/art/201111/300876.htm
關於Nginx的一些優化(突破十萬併發) :http://www.howtocn.org/nginx:%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84nginx_fastcgi%E6%9C%8D%E5%8A%A1%E5%99%A8
主要精華按照順序是:
nginx最好從官方網站下載安裝,而不要從apt-get install 安裝,這裏下載地址是
http://nginx.org/en/download.html
tar -xvf nginx-1.2.2.tar.gz
cd nginx-1.2.2
useradd www
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
如果發現缺少Pcre模塊,則apt-get install libpcre3 libpcre3-dev
重新configure
make && make install
註釋:PCRE模塊的一個功能是,解析正則。下面會講到。
這裏編譯完成後的nginx爲2M多,你可以
cd nginx-1.2.2
vi auto/cc/gcc
註釋掉CFLAGS="$CFLAGS -g"
這樣編譯完成後,nginx爲500多K。效率也會得到極大提升。
安裝完成後我們會在/usr/local/nginx下看到如下幾個文件
conf nginx默認配置文件存放目錄
html nginx默認的網站根目錄
logs nginx默認日誌文件目錄
sbin nginx默認可執行文件目錄
首先我們來嘗試啓動nginx,啓動的命令如下:
/usr/local/nginx/sbin/nginx 執行過後如果沒有任何提示,那麼nginx可能就已經啓動成功
當然也可以使用ps -ef | grep nginx 來查看進程中是否有nginx
這是可以在瀏覽器中輸入http://IP來檢查nginx能否訪問。
在html中默認有一個歡迎index.html
如果安裝成功,你將能夠看到Welcome to nginx!字樣,當然你可以更改html/index.html文件中的顯示文字。
常用命令:啓動nginx
/usr/local/nginx/sbin/nginx
刷新nginx
/usr/local/nginx/sbin/nginx -s reload
停止
/usr/local/nginx/sbin/nginx -s stop
安裝UWSGI,同樣,這個最好還是自己從官網下載吧
http://projects.unbit.it/uwsgi/
wget http://projects.unbit.it/downloads/uwsgi-1.2.4.tar.gz
tar -xvf uwsgi-1.2.4.tar.gz
cd uwsgi-1.2.4
python uwsgiconfig.py build
如果提示缺少python-header,則
apt-get install python-dev
注意,不需要再去執行
python setup.py install
因爲build之後,uwsgi已經生成了,你只需要把它拷貝到/usr/local/nginx下,即可方便調用
配置conf/nginx.conf 。主要都在這一步,這裏寫出來的是關鍵點。你看到的自己系統裏的文件內容跟這個差不多
user root root;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_connections 102400;
error_log logs/error.log;
worker_rlimit_nofile 102400;
events {
worker_connections 10240;
use epoll;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8000;
server_name localhost;
location / {
root /home/webapp;
uwsgi_pass 127.0.0.1:9000;
include uwsgi_params;
index index.html index.htm;
uwsgi_param UWSGI_CHDIR /home/webapp;
uwsgi_param UWSGI_SCRIPT apprun;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
root /home/webapp;
break;
}
}
}
這裏解釋下
1,user root root;
前面提到 adduser www用戶。我開始也是設置爲www www.但是nginx讀取靜態文件老是沒有權限,比如webapp下面的css文件。表現爲頁面混亂。用
chrome 分析,發現是加載不了CSS文件。提示Perssion denied 或者是permission forbidden.
即使對webapp目錄,執行
chmod -R 777 ./ 和chown -R www 也沒有用處。後來換成root,問題解決。
2,worker_processes 4和worker_cpu_affinity
這個主要是對nginx手動分配CPU。使其充分利用多核心
3
worker_rlimit_nofile 102400;
這個指令是指當一個nginx進程打開的最多文件描述符數目,linux下面的最多打開文件數(ulimit -n)一般是1024.這個你可以自己試驗下。所以設置大一點有好處
4 listen 這個是設置爲你最後訪問的端口。
5,server name,因爲在本機,就設置爲localhost
6,第一組location下面的
root:網站文件夾根目錄
uwsgi_pass
127.0
.
0.1
:
9000
; uwsgi的啓動參數
uwsgi_param UWSGI_CHDIR
/home/webapp; 網站文件夾下運行的python程序的父目錄。
uwsgi_param UWSGI_SCRIPT apprun; 網站文件夾下運行的python程序的名字。
7.第二組location下面的
root,主要是給出css等靜態文件的父目錄。比如我的css文件在/home/webapp/static/style.css.
當然,對應的html代碼中的引入標識就是href="/static/style.css"
另外,這個location中對CSS等靜態文件的 解析,正是需要pcre library的地方。因爲用到了正則。
到目前爲止,nginx和UWSGI都已經搞好了,下面我們安裝web.py的支持庫。
默認通過apt-get install python-webpy。即可安裝完畢。但是這種方式得到的庫webpy版本不一定是最新的,或者可能會遇到問題。
如果遇到問題,你可以通過
wget http://webpy.org/static/web.py-0.37.tar.gz
tar -xvf web.py-0.37.tar.gz
cd web.py-0.37
python setup.py build
python setup.py install
用最新的版本來試驗。
另外我還用到了Beautifulsoup.xlrd,wlwt等這些庫。每個人根據項目自己選擇。
要想uwsgi能調用apprun.py
要有以下代碼
if __name__=="__main__":
app.run()
else :
application = app.wsgifunc()
else的語句是關鍵。
最後工作
cd /usr/local/nginx
./sbin/nginx -s reload
./uwsgi -s 127.0.0.1:9000 -w apprun
在瀏覽器上輸入:http://your server address:8000即可訪問