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

为什么?

因为显示上传进度的需要。而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

发布了136 篇原创文章 · 获赞 50 · 访问量 18万+
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

<已解决>nginx配置问题 急急急

06-18

大家好 最近买了个域名,租了一台服务器(centos,yum安装 )但再nginx的配置上出了问题 这是我的/etc/nginx/nginx.conf ``` user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } } ``` 我把虚拟主机的配置放在了/etc/nginx/conf.d/目录下了 文件名:liangzda.com.conf 配置如下: ``` server { listen 80; server_name www.liangzda.com; location /{ proxy_pass http://localhost:8080; } } ``` 我安装了tomcat,监听8080端口 打算把访问www.liangzda.com的请求转发给tomcat 一顿配置之后,重启nginx时,提示出错,查看日志文件如下: [emerg] "server" directive is not allowed here in /etc/nginx/conf.d/liangzda.com.conf:1 请问应该怎么办? 最后自己发现是自己在conf.d 和 default.conf里面重复放了配置文件 所以出错,我把两个配置文件都删除了,然后自己建了一个文件夹 vhost 然后把配置文件添加到里面 ,再在nginx.conf里面添加include vhost/*.conf 就好了 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览