Windows下利用MSYS2和VS的nmake编译nginx源码

目录

一、使用说明

二、安装软件

2.1 下载依赖库

2.3 下载并安装 StrawberryPerl

2.4 下载并安装 MSYS 2

2.5 nginx源代码下载 

三、编译配置

3.1 设置NGX_MSVC_VER

3.2 配置 Makefile

3.3 编译代码

3.4 整理Nginx发布环境

四、错误处理


一、使用说明

本文章主要记录Windows下利用MSYS2和VS的nmake编译nginx源码。

这是Nginx官方说明 https://nginx.org/en/docs/howto_build_on_win32.html

To build nginx on the Microsoft Win32® platform you need:

  • Microsoft Visual C compiler. Microsoft Visual Studio® 8 and 10 are known to work.
  • MSYS or MSYS2.
  • Perl, if you want to build OpenSSL® and nginx with SSL support. For example ActivePerl or Strawberry Perl.
  • Git client.
  • PCRE, zlib and OpenSSL libraries sources.

需要安装软件Visual Studio 2022 (一定要包含C++ x64/x86 生成工具,需要通过nmake执行编译)

Openssl:实现安全套接字ssl功能

Pcre:实现正则表达式解析

Zlib:实现gzip压缩解压缩功能

二、安装软件
2.1 下载依赖库

zlib源代码下载

https://zlib.net/ 

PCRE源代码  

https://sourceforge.net/projects/pcre/files/pcre/

openssl源代码下载 https://github.com/openssl/openssl/releases/tag/openssl-3.3.2

2.3 下载并安装 StrawberryPerl

因为需要编译 OpenSSL, 需要使用 perl 进行配置

下载地址: https://strawberryperl.com/

默认安装到结束

2.4 下载并安装 MSYS 2

在编译阶段用作配置 Makefile  下载地址:https://www.msys2.org/

全部默认安装

2.5 nginx源代码下载 

地址 https://hg.nginx.org/nginx

点左侧ZIP进行下载

将文件解压,在nginx源码根目录下创建objs文件夹,再在objs下创建lib文件夹,结构如下图

将pcre-8.45.zip、zlib131.zip、openssl-openssl-3.3.2.zip解压到刚刚的lib目录

三、编译配置
3.1 设置NGX_MSVC_VER

如果不指定版本会在配置时出现报错auto/cc/msvc: line 132: [: : integer expression expected

需要根据你自己的实际vs版本号填写,只有填写成功,后面nmake才能编译成功。修改nginx\auto\cc下的msvc文件,指定NGX_MSVC_VER版本号,我vs是2022,所以是1930

3.2 配置 Makefile

使用 msys2 的任意环境进入 nginx 源码目录

从开始菜单打开安装的msys2 msys

进入到nginx源码根目录下

cd /c/sourcecode/nginx

 执行以下命令,用于生成适用于 MSVC 的 Makefile

输入如下配置命令后回车:(注意pcre,zlib,openssl版本要与你实际的文件夹一致)

auto/configure \--with-cc=cl \--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 \--http-scgi-temp-path=temp/scgi_temp \--http-uwsgi-temp-path=temp/uwsgi_temp \--with-cc-opt=-DFD_SETSIZE=32768 \--with-pcre=objs/lib/pcre-8.45 \--with-zlib=objs/lib/zlib-1.3.1 \--with-openssl=objs/lib/openssl-3.3.2 \--with-openssl-opt='no-asm no-tests -D_WIN32_WINNT=0x0601' \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_addition_module \--with-http_sub_module \--with-http_stub_status_module \--with-http_dav_module \--with-http_flv_module \--with-http_mp4_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_auth_request_module \--with-http_random_index_module \--with-http_secure_link_module \--with-http_slice_module \--with-mail \--with-mail_ssl_module \--with-stream \--with-stream_ssl_module \--with-stream_ssl_preread_module

执行成功,会出现以下界面 

Administrator@DESKTOP-0JFTJUC MSYS /c/sourcecode/nginx
# auto/configure \--with-cc=cl \--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 \--http-scgi-temp-path=temp/scgi_temp \--http-uwsgi-temp-path=temp/uwsgi_temp \--with-cc-opt=-DFD_SETSIZE=32768 \--with-pcre=objs/lib/pcre-8.45 \--with-zlib=objs/lib/zlib-1.3.1 \--with-openssl=objs/lib/openssl-3.3.2 \--with-openssl-opt='no-asm no-tests -D_WIN32_WINNT=0x0601' \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_addition_module \--with-http_sub_module \--with-http_stub_status_module \--with-http_dav_module \--with-http_flv_module \--with-http_mp4_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_auth_request_module \--with-http_random_index_module \--with-http_secure_link_module \--with-http_slice_module \--with-mail \--with-mail_ssl_module \--with-stream \--with-stream_ssl_module \--with-stream_ssl_preread_module
checking for OS+ MSYS_NT-10.0-19045 3.5.3-d8b21b8c.x86_64 x86_64+ using Microsoft Visual C++ compiler+ cl version: 1930
checking for MSYS_NT-10.0-19045 specific features
creating objs/MakefileConfiguration summary+ using PCRE library: objs/lib/pcre-8.45+ using OpenSSL library: objs/lib/openssl-3.3.2+ using zlib library: objs/lib/zlib-1.3.1nginx path prefix: ""nginx binary file: "/nginx.exe"nginx modules path: "/modules"nginx configuration prefix: "/conf"nginx configuration file: "/conf/nginx.conf"nginx pid file: "/logs/nginx.pid"nginx error log file: "/logs/error.log"nginx http access log file: "/logs/access.log"nginx http client request body temporary files: "temp/client_body_temp"nginx http proxy temporary files: "temp/proxy_temp"nginx http fastcgi temporary files: "temp/fastcgi_temp"nginx http uwsgi temporary files: "temp/uwsgi_temp"nginx http scgi temporary files: "temp/scgi_temp"Administrator@DESKTOP-0JFTJUC MSYS /c/sourcecode/nginx

可以看到根目录下的objs下已经生成了makefile文件

3.3 编译代码

以管理员方式打开VS对应的 X64 Native Tools Command … for VS 2022

进入到nginx根目录,输入如下命令后回车

nmake -f objs/Makefile

 就开始编译

等待编译完成,会在 nginx/objs/ 文件夹内出现 nginx.exe

至此,Nginx编译完成。打开objs目录,显示如下

3.4 整理Nginx发布环境

nginx.exe运行依赖同级目录下存在conf、html、logs、temp目录及配置文件,否则无法启动。将源码目录下的conf、contrib、html、logs、temp和objs\nginx.exe整理到一个目录下。

启动nginx.exe,一个nginx服务器就搭建起来了,运行截图  

看生成的nginx编译信息  nginx -V

C:\nginx>nginx -V
nginx version: nginx/1.27.2
built by cl 1930
built with OpenSSL 3.3.2 3 Sep 2024
TLS SNI support enabled
configure arguments: --with-cc=cl --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 --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp --with-cc-opt=-DFD_SETSIZE=32768 --with-pcre=objs/lib/pcre-8.45 --with-zlib=objs/lib/zlib-1.3.1 --with-openssl=objs/lib/openssl-3.3.2 --with-openssl-opt='no-asm no-tests -D_WIN32_WINNT=0x0601' --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_stub_status_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module
四、错误处理

4.1 auto/cc/msvc: line 132: [: : integer expression expected

这里报错原因是msvc版本缺失,无法自动识别,根据3.1章节进行设置

4.2 找不到VS带的X64 Native Tools Command … for VS xxxx

检查VS安装是否包含了C++ x64/x86 生成工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541129.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【正点原子K210连载】第四十章 YOLO2人手检测实验摘自【正点原子】DNK210使用指南-CanMV版指南

第四十章 YOLO2人手检测实验 在上一章节中,介绍了利用maix.KPU模块实现YOLO2的人脸检测,本章将继续介绍利用maix.KPU模块实现YOLO2的人手检测。通过本章的学习,读者将学习到YOLO2网络的人手检测应用在CanMV上的实现。 本章分为如下几个小节&…

RocketMQ核心编程模型与最佳实践

目录 一、RocketMQ的消息模型 1、RocketMQ客户端基本流程 2、消息确认机制 3、广播消息 4、顺序消息机制 5、延迟消息 6、批量消息 7、过滤消息 8、事务消息 9、ACL权限控制机制 二、SpringBoot整合RocketMQ 1、快速实战 2、如何处理各种消息类型 3、实现原理 三…

周末愉快!——周复盘

加班的晚上有一个美梦! 周末愉快简单复盘结尾 精华: 在这个信息爆炸的时代,我们的大脑每天都被无数的数据和刺激充斥,以至于我们常常感到应接不暇。然而,正如古人所言:“不飞则已,一飞冲天”&am…

GraphRAG 与 RAG 的比较分析

检索增强生成(RAG)技术概述 检索增强生成(Retrieval-Augmented Generation,简称 RAG)是一种旨在提升大型语言模型(Large Language Models,LLMs)性能的技术方法。其核心思想是通过整…

容器化安装Jenkins部署devops

基础环境介绍 系统使用的是centos7.9 内核使用的是5.16.13-1.el7.elrepo.x86_64 容器使用的是26.1.4 docker-compose使用的是 v2.29.0 链路图 devops 配置git环境插件 部署好jenkins后开始配置 jenkins连接git,这里需要jenkins有连接git的插件。在已安装的插件…

豆包Python SDK接入流程

模型与价格 豆包的模型介绍可以看豆包大模型介绍,模型价格可以看豆包定价文档里的“模型推理” - “大语言模型” - “字节跳动”部分。 推荐使用以下模型: Doubao-lite-32k:每百万 token 的输入价格为 0.3 元,输出价格为 0.6 元…

Hexo博客私有部署Twikoo评论系统并迁移评论记录(自定义邮件回复模板)

部署 之前一直使用的artalk,现在想改用Twikoo,采用私有部署的方式。 私有部署 (Docker) 端口可以根据实际情况进行修改 docker run --name twikoo -e TWIKOO_THROTTLE1000 -p 8100:8100 -v ${PWD}/data:/app/data -e TWIKOO_PORT8100 -d imaegoo/twi…

LabVIEW编程能力如何能突飞猛进

要想让LabVIEW编程能力实现突飞猛进,需要采取系统化的学习方法,并结合实际项目进行不断的实践。以下是一些提高LabVIEW编程能力的关键策略: 1. 扎实掌握基础 LabVIEW的编程本质与其他编程语言不同,它是基于图形化的编程方式&…

nethogs显示每个进程所使用的带宽

1、安装nethogs: Ubuntu、Debian和Fedora用户可以从默认软件库获得。CentOS用户则需要Epel。 #ubuntu或debian安装方法 sudo apt-get install nethogs #fedroa或centos安装法 sudo yum install nethogs -y 2、使用测试 nethogs是一款小巧的"net top&quo…

开源项目还需要花钱吗

开源和免费并不完全等同,很多用户对开源软件是否真的不花钱存在误解。本文深入探讨开源的真正含义、开源项目是否需要付费、以及开源软件的盈利模式。通过分析国内外主流开源平台,我们将帮助读者更好地理解开源与免费之间的区别。 什么是开源 开源软件指…

增强现实系列—GaussianAvatars: Photorealistic Head Avatar

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【ollama】ollama配置本地大模型并运行

ollama的Github链接 https://github.com/ollama/ollamaollama官网链接 https://ollama.com/打开后点击下载 下载完成后进行安装,安装完毕后在终端输入以下,代表安装成功 ollama在ollama官网的模型库中找到需要的模型,这里使用阿里最新开源…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心(clock backbone)将设备分为相邻的左侧和右侧区域,水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧,从而将某些时钟资源扩展到水平相邻区域。BUFG不…

JavaWeb---三层架构

文章目录 1. 为什么需要分层?2.软件设计中的分层模式3.分层4.三层架构:显示层、业务逻辑层、数据访问层3. 案例:利用三层架构原理实现编写web程序的流程 摘自:https://blog.csdn.net/qq_64001795/article/details/124112824 1. 为…

死锁(详解版)

一、什么是死锁 死锁就是多个线程在运行过程中,都需要获取对方线程所持有的锁(资源),导致处于长期无限等待的状态。 二、死锁产生原因 两个线程各自持有不同的锁,然后试图获取对方线程的锁,造成双方无限等待…

聊城网站建设:企业如何打造高效官网

聊城网站建设:企业如何打造高效官网 在互联网飞速发展的今天,官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说,建立一个高效的官网显得尤为重要。本文将分享一些关键步骤,帮助企业打造一…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

书客、柏曼、明基护眼台灯怎么样?实测三款热门护眼台灯推荐

随着市场上照明产品种类的日益丰富,从护眼台灯到护眼落地灯等各种选择足以让初次接触的宝妈们感到困惑,仿佛置身于一个复杂的选择迷宫。为了帮助大家筛选出真正优质的护眼灯,作为一位长期关注护眼照明领域的评测博主,我综合考虑了…

Swift里的数值变量的最大值和最小值

Swift里有很多种数值变量,如Int,Int8,Float,Double等。和绝大多数编程语言一样,由于是在计算机上运行,内存有限,所以必有最大值和最小值,而计算机无法处理超过该值的数。 在Swift中…

Unity 3D 概览一口气讲完!\(@^0^@)/

PS:好久没做Unity内容了,先做个合集凑合看着吧。。谢啦!!☆⌒(*^-゜)v Unity 3D 简介 Unity 3D 也称 Unity,是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综…