Nginx的官方最近也开始提供Windows版本的下载了


如果不需要附加的第三方模块的话,直接使用其提供的Windows版本就可以了


但我们线上运行的Nginx需要编译进好多附加的模块,所以只能自己动手了


上网Google一搜,好多关于在Cygwin下编译Nginx的文章


但真正自己动手去编译,发现还是出了很多的问题


我使用的编译选项如下:



折叠复制代码




  1. ./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





 


在编译过程中,遇到了以下问题:



  1. prefix的选项,如果我们指定--prefix=/cygdrive/d/nginx,那么最后脱离Cygwin环境运行,会发现root无法指向其它磁盘上的目录,所以这里使用了相对路径,而且指定了可执行文件nginx在根目录下,而不是默认的sbin/nginx

  2. FD_SETSIZE=4096,网上都说了,是将select模式的最大worker_connections加大

  3. 编译mod_passport之前,最好执行dos2unix.exe mod_passport/config转换一下格式

  4. 编译mod_passport时,会报错:cc1: warnings being treated as errors,需要修改objs/Makefile文件,把其中的-Werror删除即可

  5. 编译成功后,在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目录下

  6. 最后,不使用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相关逻辑判断注释掉
    最后重新编译运行,才成功了

  7. 当引用外部的目录时,需要用cygwin格式的路径,如:root /cygdrive/d/work/git/python_mail/web;


 


最后,写了一个restart.bat脚本,用来重启nginx



折叠复制代码




  1. @echo off

  2. echo Stoping nginx...

  3. taskkill /F /IM nginx.exe

  4. echo Validating nginx.conf...

  5. nginx.exe -t -c conf/nginx.conf

  6. echo Starting nginx...

  7. nginx.exe -c conf/nginx.conf

  8. tasklist | findstr nginx