Nginx初步-2: 添加nginx-upload-module模塊

爲何?php

由於顯示上傳進度的須要。而PHP官方的進度支持不適用於Nginx+PHP via FastCGI。相關文章請參考使用Session來跟蹤上傳進度。該文最後的Warning表示Nginx會本身處理上傳,而PHP就只能獲得一個最終結果,不能跟蹤過程。最後一個跟帖(來自s.zarges)也給出相同的警告。這樣,就不得不找別的辦法,好比APC之類。而我選擇了nginx-upload-module。html


關於nginx-upload-modulenginx

這個模塊由vkholodkov於5年前開發,如今已經不更新N久了。其源代碼位於:https://github.com/vkholodkov/nginx-upload-module/tree/2.2。這是文檔。直接下載源代碼
git

下載完成後,解壓:github

tar xvfz nginx_upload_module-2.0.11.tar.gz


須要打補丁
shell

代碼恆久遠,八哥永流傳。多少年過去了,許多代碼變得面目全非,許多更失去了原本面目,只剩下那一砣砣的八哥,提醒咱們曾經輝煌的過往。如今的Nginx相對5年前,已經修改了不少東西,好比ngx_http_read_request_body_t已經刪除了to_write成員,而該成員被nginx-upload-module所須要。其結果就是nginx-upload-module沒法編譯。關於該問題的討論請參考這個連接。咱們要感謝這個哥們:davromaniak,他修改了nginx-upload-module,修正了錯誤,使之能夠經過編譯。這是他的關於該問題修正的博文。咱們要作的就是下載他的修改,給nginx-upload-module打補丁。session

下載的Patch文件名爲 davromaniak.txtapp

打補丁使用如下命令:函數

cp darvromaniak.txt [nginx_upload_module所在目錄]
patch ngx_http_upload_module.c davromaniak.txt


將模塊編譯進Nginx
url

先從這個連接下載Nginx源碼。而後編譯:

cd nginx-1.5.8

./configure --prefix=. --sbin-path=nginx --conf-path=config/nginx.conf --pid-path=logs/nginx.pid --error-log-path=logs/error.log --with-cc-opt="-D FD_SETSIZE=4096" --with-debug --add-module=../nginx_upload_module-2.0.11 --add-module=../nginx-upload-progress-module-0.9.1
make
make install


在短暫的等待後,編譯和安裝就完成了,能夠重啓Nginx。


遇到的問題:

我使用了比較舊的nginx-upload-module(2.0),若是你使用的是新的2.2,遇到什麼問題,請自行解決。

  1. prefix的選項,若是咱們指定–prefix=/cygdrive/d/nginx,那麼最後脫離Cygwin環境運行,會發現root沒法指向其它磁盤上的目錄,因此這裏使用了相對路徑,並且指定了可執行文件nginx在根目錄下,而不是默認的sbin/nginx。

  2. FD_SETSIZE=4096,網上都說了,是將select模式的最大worker_connections加大。若是不加此參數將可能出現如下的錯誤提示:[emerg] 2496#0: the maximum number of files supported by select() is 64的錯誤提示。這表示FD_SETSIZE的值比nginx配置文件中worker_connections指令所指定的值小,你能夠把nginx.conf裏的worker_connections選項改小一些,好比44,加了–with-cc-opt=」-DFD_SETSIZE=4096」後就不會碰到這問題 。

  3. 我參考的文章中 --conf-path 參數都是 conf/nginx.conf,這個是默認的。可是這樣指定的話,在make install的時候會報:cp: "conf/koi-win" 與"./conf/koi-win" 爲同一文件的錯誤。由於咱們是在源碼文件夾中編譯的,裏面有conf這個文件夾,而 make install 的時候又會將源碼文件夾中的conf/nginx.conf拷貝到目標文件夾,但咱們命令中 --prefix 指定的就是當前文件夾,所以會報錯。解決辦法就是編譯的時候將配置文件指定到其餘名稱的文件夾中(如本例中的 config/)。

  4. 編譯成功後,在Cygwin下運行正常,但若是要脫離Cygwin,須要從cygwin/bin下拷貝cygwin1.dll,cyggcc_s-1.dll,cygz.dll,cygcrypto-0.9.8.dll,cygcrypto-1.0.0.dll,cygpcre-0.dll,cygpcre-1.dll,cygcrypt-0.dll這幾個dll到nginx目錄下。

補充:

nginx-upload-module(2.2)若是遇到在函數‘ngx_http_upload_merge_ranges’中: 

/usr/local/app/nginx_upload_module-2.2.0/ngx_http_upload_module.c:1682:22: 錯誤:變量‘result’被設定但未被使用 [-Werror=unused-but-set-variable] 

就把Makefile文件裏的 -Werror去掉


重啓Nginx的腳本

@echo off 
echo Stoping nginx… 
taskkill /F /IM nginx.exe 
echo Validating nginx.conf… 
nginx.exe -t -c conf/nginx.conf 
echo Starting nginx… 
nginx.exe -c conf/nginx.conf 
tasklist | findstr nginx


參考:

http://www.jb51.net/softjc/37172.html

http://www.tech126.com/cygwin-nginx/

http://wiki.nginx.org/InstallOptions#Notes

相關文章
相關標籤/搜索