使用Cygwin编译Windows上的Nginx
Nginx的官方最近也开始提供Windows版本的下载了
如果不需要附加的第三方模块的话,直接使用其提供的Windows版本就可以了
但我们线上运行的Nginx需要编译进好多附加的模块,所以只能自己动手了
上网Google一搜,好多关于在Cygwin下编译Nginx的文章
但真正自己动手去编译,发现还是出了很多的问题
我使用的编译选项如下:
折叠复制代码
- ./configure --prefix=.--sbin-path=nginx--with-cc-opt="-D FD_SETSIZE=4096"--with-debug --with-mail --with-mail_ssl_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module--add-module=../nginx-upload-progress-module--add-module=../nginx_passport--add-module=../ngx_cache_purge-1.0--add-module=../headers-more-nginx-module
在编译过程中,遇到了以下问题:
- prefix的选项,如果我们指定--prefix=/cygdrive/d/nginx,那么最后脱离Cygwin环境运行,会发现root无法指向其它磁盘上的目录,所以这里使用了相对路径,而且指定了可执行文件nginx在根目录下,而不是默认的sbin/nginx
- FD_SETSIZE=4096,网上都说了,是将select模式的最大worker_connections加大
- 编译mod_passport之前,最好执行dos2unix.exe mod_passport/config转换一下格式
- 编译mod_passport时,会报错:cc1: warnings being treated as errors,需要修改objs/Makefile文件,把其中的-Werror删除即可
- 编译成功后,在Cygwin下运行正常,但如果要脱离Cygwin,需要从cygwin/bin下拷贝cygwin1.dll,cyggcc_s-1.dll,cygz.dll,cygcrypto-0.9.8.dll,cygssl-0.9.8.dll,cygpcre-0.dll,cygcrypt-0.dll这几个dll到nginx目录下
- 最后,不使用Cygwin,在普通Dos下运行nginx时,会报错:emerge: getpwnam("nobody") fail。这也是最令我郁闷的一个错误了,看了网上很多人的帖子,似乎都很顺利就成功了,但用我的Cygwin编译出来的nginx,就一直报这个错误,尝试不加第三方模块,指定user为本机的administrator,依然报错...郁闷了很久之后,最后还是找到nginx源码中相关逻辑,做如下修改:最后重新编译运行,才成功了nginx-0.8.49/src/core/nginx.c,把getpwnam和getgrnam相关逻辑判断注释掉
nginx-0.8.49/src/os/unix/ngx_process_cycle.c把setgid和setuid相关逻辑判断注释掉 - 当引用外部的目录时,需要用cygwin格式的路径,如:root /cygdrive/d/work/git/python_mail/web;
最后,写了一个restart.bat脚本,用来重启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
我也碰到了同样的问题,也是getgrnam failed 但是getpwnam获取到了值,不知道是不是CYGWIN的用户分配错误还是另有玄机,早该看到这篇BLOG文就好了
你好,我按你写的
nginx-0.8.49/src/core/nginx.c,把getpwnam和getgrnam相关逻辑判断注释掉
nginx-0.8.49/src/os/unix/ngx_process_cycle.c把setgid和setuid相关逻辑判断注释掉
这后,发现可以运行了,可是调用fastcgi-php的时候却不好使了,不知道你有没有这个问题,如果没有,那你是注释了哪些代码呢?
只要你编译后的Nginx能起来,应该就没问题的
不过我的Nginx在前端主要是用作反向代理的
我还真没有尝试过fastcgi-php,回头有空我试试
兄弟,按你说的方法编译成功了,也脱离cygwin独立运行了,但是我添加的两个模块就是用不了,编译的时候也没有提示错误
对了,我添加的两个模块是sub_filter和ngx_http_accesskey_module
[...] 使用Cygwin编译Windows上的Nginx [...]
cygwin不如vc流畅,博主试试。