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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

为什么?

因为显示上传进度的需要。而PHP官方的进度支持不适用于Nginx+PHP via FastCGI。相关文章请参考使用Session来跟踪上传进度。该文最后的Warning表示Nginx会自己处理上传,而PHP就只能得到一个最终结果,不能跟踪过程。最后一个跟帖(来自s.zarges)也给出相同的警告。这样,就不得不找别的办法,比如APC之类。而我选择了nginx-upload-module。


关于nginx-upload-module

这个模块由vkholodkov于5年前开发,现在已经不更新N久了。其源代码位于:https://github.com/vkholodkov/nginx-upload-module/tree/2.2。这是文档。直接下载源代码。

下载完成后,解压:

tar xvfz nginx_upload_module-2.0.11.tar.gz


需要打补丁

代码恒久远,八哥永流传。多少年过去了,许多代码变得面目全非,许多更失去了本来面目,只剩下那一砣砣的八哥,提醒我们曾经辉煌的过往。现在的Nginx相对5年前,已经修改了很多东西,比如ngx_http_read_request_body_t已经删除了to_write成员,而该成员被nginx-upload-module所需要。其结果就是nginx-upload-module无法编译。关于该问题的讨论请参考这个链接。我们要感谢这个哥们:davromaniak,他修改了nginx-upload-module,修正了错误,使之可以通过编译。这是他的关于该问题修正的博文。我们要做的就是下载他的修改,给nginx-upload-module打补丁。

下载的Patch文件名为 davromaniak.txt。

打补丁使用以下命令:

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


将模块编译进Nginx

先从这个链接下载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


转载于:https://my.oschina.net/u/178116/blog/305571

你可能感兴趣的:(Nginx初步-2: 添加nginx-upload-module模块)