logo资料库

Windows下编译Nginx并添加模块.docx

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
Windows 下编译 Nginx 并添加模块 一.准备工作 1.环境安装 1.安装 vs2010 或 vs2013 等 vs 工具。 2.安装 ActivePerl,安装完成后,将其安装路径加入到 PATH 环境变量。 3.安装 MinGW,下载 mingw-get-setup.exe,安装完成后,将其安装路径加 入到 PATH 环境变量。(记得安装的时候装上 msys,不懂就全勾了) 4.安装 nasm,安装完成后,将其安装路径加入到 PATH 环境变量。 2.下载编译 nginx 源码文件 1.nginx 源码:nginx-1.12.2 2.pcre:pcre-8.40 3.zlib:zlib-1.2.11 4.openssl:openssl-1.0.2l 3.下载添加模块文件 1.文件上传模块: nginx-upload-module 2.rtmp 模块:nginx-rtmp-module 3.文件上传进度条模块:nginx-upload-progress-module 二.编译并添加模块 1. 将 上 述 7 个 压 缩 包 文 件 解 压 至 文 件 夹 msys 文 件 目 录 下 , 如 C:\MinGW\msys\1.0\home\$UESRNAME\。 2.找到 msys.bat 的路径并双击 msys.bat,运行。如下图所示
3.打开 msys.bat 后如下所示 右击上方编辑栏,选择编辑,粘贴,可进行粘贴复制功能。 4.cd 至 nginx 源码路径,并在源码路径下执行下面语句: auto/configure --with-cc=cl --builddir=objs --prefix= \ --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \ --http-log-path=logs/access.log --error-log-path=logs/error.log \ --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \ --http-proxy-temp-path=temp/proxy_temp \ --http-fastcgi-temp-path=temp/fastcgi_temp \ --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=../pcre-8.40 \ --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2l \ --with-select_module --with-http_ssl_module \ --with-http_sub_module \ --add-module=../nginx-upload-module-2.255 \ --add-module=../nginx-upload-progress-module-master \ --add-module=../nginx-rtmp-module-master \ 其中 pcre,zlib,openssl 的语句需根据版本号的不同进行改变,最后增加 的模块也需更具实际情况进行相应的改变,步骤 4 操作如下图所示:
下图表示正在形成 Makefile 文件,请等待。 这里会发现有一个异样的提示,auto/cc/msvc: line 117: [: : integer expression expected ,只要修改文件$nginx 源码目录\auto\cc\msvc 即可, echo " + cl version: $NGX_MSVC_VER"的前面加入一行 NGX_MSVC_VER=15.00, 当然不修改也不会影响后续的编译。(因为不会影响后续编译,我并没有修改) 如果需要指定后续编译 nginx 时禁用优化,则将其中的 CFLAGS="$CFLAGS -O2" 修改为 CFLAGS="$CFLAGS -Od"。
下图表示生成 Makefile 文件成功。 5.接着我们就可以退出 msys,使用已经下载好的 vs2010 或者 vs2013 的开 发人员命令提示工具,cd 至 nginx 路径下,并输入 nmake /f objs/Makefile。 开始执行 Makefile 文件。下面进行编译问题分析: 6.此时就该使用我们之前下载的 NASM 了。 打开 nginx 源码路径下的 auto\lib\openssl\makefile.msvc,将其中的 ms\do_ms 修改为 ms\do_nasm,并打开 openssl 源码路径,删除其中的 out32
和 tmp32,之后重新执行步骤 5,在 vs 开发人员命令提示工具中执 行 Makefile 文件。 7.由上图可知,nginx-upload-module 模块由于长时间没有更新,可能和现 在 的 nginx 源 码 有 一 定的 不 兼 容 , 需 要 进行 一 定 的 修 改 。 ( 见 附 件 : ngx_http_nginx_uplaod_module.c) ①error C2220:警告被视为错误 - 没有生成”object”文件。 解决方法:修改 nginx 源码路径下的 objs 中的 Makefile 文件。将-WX 去掉(就在第一行),这样做能忽略警告。 ②error C2065:“__unused__”:未声明的标识符。 解决方法:由于 __attribute__((__unused__))表示该函数或变量可能 不使用,这个属性可以避免编译器产生警告信息,这是在 linux 内核中 的定义,我们在 windows 下编译时直接将其注释掉。 ③error C2039:”st_size”:不是“_BY_HANDLE_FILE_INFORMATION”的 声明。 解决方法:st_size 是 linux 下 struct stat 中的成员变量,st_size 表示文件的大小,_BY_HANDLE_FILE_INFORMATION 是 windows 的结构体, 其中成员变量 nFileSizeHigh 和 nFileSizeLow 代表文件大小的低 32
位和高 32 位 ,计算文件大小使用 (fileInfo.nFileSizeHigh*(MAXDWORD+1))+fileInfo.nFileSizeLow 替代 fileInfo.st_size 即可。 继续编译,我们会发现有会有新的错误出现。 ④主要是 ftruncate() ,strncasecmp(),ngx_unlock_fd(),ngx_lock_fd() 未定义。 解决方法: 由于以上几个函数都是或者使用了 linux 下的函数,所以 导 致 编 译 失 败 了 , 只 要 将 其 使 用 其 他 函 数 进 行 替 代 就 可 以 了 。 strncasecmp() 函 数 可 以 找 到 原 函 数 , 处 理 比 较 简 单 , 在 ngx_http_upload_module.c 文件中自己定义一个 strncasecmp()函数 就可以了。函数原型如下: int strncasecmp(char *a, char *b, int n) { } int ca, cb; if (a == b || n <= 0) return 0; do { ca = *a++; cb = *b++; if (ca >= 'A' && ca <= 'Z') ca += 'a' - 'A'; if (cb >= 'A' && cb <= 'Z') cb += 'a' - 'A'; } while (--n > 0 && ca == cb && ca != '\0'); return ca - cb;
ngx_unlock_fd(state_file->fd),ngx_lock_fd(state_file->fd) 这 两 个 线 程 锁 函 数 暂 时 使 用 ngx_shmtx_lock(state_file->fd) 和 ngx_shmtx_unlock(state_file->fd)进行替代。 ftruncate() 函 数 是 截 取 一 定 大 小 的 文 件 , 这 边 可 以 使 用 函 数 _chsize_s(state_file->fd, out_buf.file_pos);进行替代。 8.之后再编译就能看到已经完成了,成功的结果图如下所示,并能在 objs 目录 下看到编译完成 nginx.exe。(第一次安装的时候显示 sed 产生问题,现在环境 装好无法再现,如遇到一样的问题可以百度安装下 sed)
三.验证 nginx 是否编译正确 上面我们已经编译完成了 nginx,我们只需另外建立一个 nginx 文件夹,将 nginx.exe 文件放入 nginx 文件夹。如下图所示,其中的配置文件可以从网上下 载 windows 下的 nginx,解压出来就有。 然后我们在浏览其中输入 http://localhost/,如果出现以下画面,则表示 安装成功。
分享到:
收藏