资讯动态

Java 项目实战: 外卖平台优化-Nginx概述与源码编译安装

发布时间:2026/10/4 4:22:15 来源:尧图企业网站定制
接入 Nginx: 轻量级 Web 服务器定位与源码编译安装纲要本篇对应课程day02的「Nginx概述」与「下载和安装」覆盖Nginx是什么轻量级Web服务器 / 反向代理服务器 / 邮件代理服务器与Tomcat的定位差异为什么并发强master-worker多进程模型 epoll事件驱动与Tomcat的线程模型对比版本选择Mainline与Stable的区别为什么生产用稳定版源码编译安装五步装依赖 → 下载 → 解压 →./configure→make make install依赖包逐个解释gcc、pcre-devel、zlib-devel、openssl-devel各自负责什么--prefix的意义为什么必须显式指定不指定会装到哪里缺少依赖通过yum 安装依赖包gcc / pcre-devel / zlib-devel / openssl-develwget 下载 nginx-1.16.1.tar.gztar -zxvf 解压./configure --prefix/usr/local/nginx检查环境 生成 Makefile检查是否通过make 编译make install 安装/usr/local/nginxconf html logs sbin一、Nginx 是什么官方定义Nginx是一款轻量级的Web服务器、反向代理服务器以及电子邮件IMAP/POP3/SMTP代理服务器。拆开看这三重身份身份作用在外卖平台中的用途Web服务器直接对外提供静态资源HTML/CSS/JS/图片部署移动端与后台的前端页面反向代理服务器接收客户端请求转发给后端真实服务器再把响应回给客户端把/api/请求转发到8080端口的Spring Boot邮件代理服务器代理IMAP/POP3/SMTP本项目中不使用与 Tomcat 的区别这是最容易混淆的一组概念。二者都能部署Web项目但设计目标完全不同维度NginxTomcat核心职责HTTP服务、反向代理、负载均衡、静态资源Servlet容器运行Java Web应用处理静态资源极强直接sendfile零拷贝较弱DefaultServlet处理效率低处理动态请求不支持必须转发原生支持执行Servlet/JSP并发模型多进程 epoll事件驱动C10K轻松线程池BIO/NIO线程数受限内存占用极低静态服务场景数MB较高JVM堆内存起步典型部署位置最外层面向公网Nginx之后内网生产上的标准架构是二者配合而非二选一Nginx在最外层扛住海量连接、处理静态资源、HTTPS卸载、限流动态请求反向代理给后面的Tomcat/Spring Boot。为什么并发能力强Nginx启动后有两类进程master进程只有一个负责读取配置、管理worker进程、接收信号、平滑升级worker进程默认一个可配置多个真正处理请求关键在于worker采用epoll多路复用 异步非阻塞模型一个worker进程就能同时维持数万连接连接数与进程数无关。对比Tomcat的线程模型默认一个请求占一个线程maxThreads通常配 200~500线程上下文切换开销随并发上升而急剧增加。Tomcat模型Tomcat线程 1 → 连接 1线程 2 → 连接 2线程 N → 连接 NNginx模型master 进程worker 进程 1epoll 管理数万连接worker 进程 2epoll 管理数万连接实际项目中的常识把worker_processes设为CPU核心数或auto让每个worker绑定一个核避免进程在核之间迁移带来的CPU缓存失效。版本与历史Nginx由俄罗斯工程师Igor Sysoev开发最初为Rambler.ru站点服务第一个公开版本0.1.0发布于2004 年 10 月 4 日。官网提供三类版本版本类型说明适用场景Mainline version主线版包含最新特性与修复更新频繁追求新特性、能接受风险Stable version稳定版只合入严重Bug修复生产推荐Legacy versions历史版本兼容遗留环境课程选用1.16.1Stable。不要在生产上追最新版本——新版本意味着新代码路径尚未被大规模验证而出问题的代价是整站不可用。二、安装前的准备环境说明项目值操作系统CentOS 7Nginx版本1.16.1安装目录/usr/local/nginx远程工具FinalShell课程资料中已经提供了安装包nginx-1.16.1.tar.gz位于项目优化/资料/day02/可以直接用FinalShell上传也可以在Linux上直接wget下载。为什么是源码编译而不是yum installLinux章节讲过四种安装方式这里用的是二进制发布包安装的变体——源码编译安装。原因是yum源的Nginx版本往往很旧且默认编译参数不含某些模块源码编译可以自定义模块--with-http_ssl_module、--with-http_v2_module、第三方模块如nginx-upsync-module只能在编译时加--prefix可以指定安装位置卸载时直接删目录即可不污染系统目录代价是需要手动解决依赖、编译耗时。对Nginx这种依赖较少的C项目来说代价可接受。三、安装 Nginx第一步安装依赖包Nginx使用C语言开发编译前必须有编译环境同时它依赖几个第三方库yum-yinstallgcc pcre-devel zlib-devel openssl openssl-devel每个包的作用包名作用缺失后果gccC语言编译器./configure报C compiler cc is not foundpcre-develPerl兼容正则表达式库无法使用location正则匹配、rewritezlib-devel压缩库无法开启gzip压缩opensslSSL运行库无法提供HTTPSopenssl-develSSL开发头文件无法编译http_ssl_module注意带-devel后缀的包是开发包包含头文件.h和链接库gcc编译时需要。只装运行时包pcre、zlib编译会失败。第二步下载安装包先确认wget是否可用wget# -bash: wget: command not found若提示command not found先安装yuminstallwget然后下载wgethttps://nginx.org/download/nginx-1.16.1.tar.gzwget的特点值得记一下它在弱网环境下会自动重试且支持断点续传——下载中断后重新执行会自动从断点继续这对大文件很关键curl -O默认不支持。下载完成后当前目录会出现nginx-1.16.1.tar.gz。第三步解压tar-zxvfnginx-1.16.1.tar.gz参数含义-z用gzip解压-x解包-v显示过程-f指定文件名。解压后得到nginx-1.16.1/目录。第四步配置编译环境cdnginx-1.16.1 ./configure--prefix/usr/local/nginx这一步不是安装而是做两件事环境检查检测编译器、依赖库、OS特性是否满足把结果写入objs/ngx_auto_config.h生成Makefile根据--prefix与各种--with-xxx/--without-xxx参数决定编译哪些模块、最终装到哪输出大致如下checking for OS Linux 3.10.0-957.el7.x86_64 x86_64 checking for C compiler ... found using GNU C compiler checking for PCRE library ... found checking for OpenSSL library ... found checking for zlib library ... found ... Configuration summary using system PCRE library using system OpenSSL library using system zlib library nginx path prefix: /usr/local/nginx nginx binary file: /usr/local/nginx/sbin/nginx nginx configuration prefix: /usr/local/nginx/conf nginx configuration file: /usr/local/nginx/conf/nginx.conf nginx pid file: /usr/local/nginx/logs/nginx.pid最后这段Configuration summary是重要信息——它明确告诉你各文件的最终落点。关于--prefix若不指定默认装到/usr/local/nginxNginx自身的默认值但显式指定是良好习惯。更重要的是后续要加模块时必须用相同的--prefix重新编译否则会把旧安装覆盖掉。如果需要HTTPS现代站点基本必需应加上./configure--prefix/usr/local/nginx\--with-http_ssl_module\--with-http_v2_module\--with-http_gzip_static_module编译后加模块不能重新./configure覆盖安装正确做法是重新编译出一个新二进制替换sbin/nginx再nginx -s reload。第五步编译并安装makemakeinstallmake按Makefile编译源代码产物在objs/目录make install把编译产物、配置文件、HTML页面复制到--prefix指定的目录课程讲义用的是make make install表示两条命令用语义同时执行。建议用——make失败时不会继续执行make install。验证安装cd/usr/local/nginxls# conf html logs sbin四个目录出现即安装成功。四、完整安装脚本把上述步骤整理为可重复执行的脚本#!/bin/bash# Nginx 1.16.1 源码编译安装脚本# 适用CentOS 7set-eNGINX_VERSION1.16.1INSTALL_PREFIX/usr/local/nginxecho 1. 安装依赖包 yum-yinstallgcc pcre-devel zlib-devel openssl openssl-develecho 2. 安装 wget yum-yinstallwgetecho 3. 下载安装包 cd/usr/local/srcif[!-fnginx-${NGINX_VERSION}.tar.gz];thenwgethttps://nginx.org/download/nginx-${NGINX_VERSION}.tar.gzfiecho 4. 解压 tar-zxvfnginx-${NGINX_VERSION}.tar.gzcdnginx-${NGINX_VERSION}echo 5. 配置编译环境 ./configure--prefix${INSTALL_PREFIX}\--with-http_ssl_module\--with-http_v2_module\--with-http_gzip_static_moduleecho 6. 编译并安装 makemakeinstallecho 7. 验证 ${INSTALL_PREFIX}/sbin/nginx-vecho安装完成目录${INSTALL_PREFIX}保存为/usr/local/src/install_nginx.sh执行chmodx /usr/local/src/install_nginx.sh /usr/local/src/install_nginx.shset -e的作用是任何一条命令失败就立即退出避免依赖没装成功时继续执行最后得到一个看似成功实则残缺的安装。五、常见问题现象原因解决./configure报C compiler cc is not found未装gccyum -y install gcc报the HTTP rewrite module requires the PCRE library未装pcre-develyum -y install pcre-devel报SSL modules require the OpenSSL library未装openssl-develyum -y install openssl openssl-develwget: command not found未装wgetyum install wgetmake报No rule to make target./configure未成功回到上一步看报错装完依赖重跑启动后浏览器访问不到防火墙未放行80端口systemctl stop firewalld或firewall-cmd --zonepublic --add-port80/tcp --permanent firewall-cmd --reload报Address already in use80端口被占用Apache等netstat -tunlp防火墙那条要特别注意生产环境不要直接systemctl stop firewalld正确做法是只放行需要的端口firewall-cmd--zonepublic --add-port80/tcp--permanentfirewall-cmd--zonepublic --add-port443/tcp--permanentfirewall-cmd--reloadfirewall-cmd--zonepublic --list-portsAPI 速览命令 / 参数作用yum -y install gcc pcre-devel zlib-devel openssl openssl-devel安装Nginx编译所需的全部依赖wget url从指定URL下载文件支持断点续传yum install wget安装wget命令tar -zxvf file解压.tar.gz包-zgzip、-x解包、-v显示过程、-f指定文件./configure --prefixdir检查编译环境并生成Makefile--prefix指定安装目录./configure --with-http_ssl_module启用HTTPS支持./configure --with-http_v2_module启用HTTP/2./configure --with-http_gzip_static_module启用预压缩文件支持make按Makefile编译源码make install把编译产物安装到--prefix指定目录make make install编译成功后立即安装systemctl stop firewalld关闭防火墙仅测试环境firewall-cmd --add-port80/tcp --permanent永久放行80端口生产推荐netstat -tunlp | grep :80查看占用80端口的进程官方文档Nginx官网https://nginx.org/Nginx下载页https://nginx.org/en/download.htmlNginx官方安装文档Building nginx from Sourceshttps://nginx.org/en/docs/configure.htmlNginx核心模块指令参考https://nginx.org/en/docs/ngx_core_module.htmlNginx官方管理信号文档https://nginx.org/en/docs/control.html总结Nginx与Tomcat是配合关系而非替代关系。Nginx扛连接、管静态、做转发Tomcat跑Java业务逻辑。理解这一点后面看到「Nginx部署前端 反向代理到8080」的架构就不会困惑。并发能力来自模型而非硬件。master进程管workerworker用epoll单进程维持数万连接——这与Tomcat一请求一线程是本质差异。生产上worker_processes设为CPU核数即可盲目调大反而增加调度开销。源码编译的核心是./configure这一步。它不装东西只做环境检查和生成Makefile。看懂它的Configuration summary输出就知道每个文件最终落在哪里。缺依赖的报错都集中在这一步按提示补-devel包即可。--prefix要记牢。将来加模块重编译时必须用同一个--prefix否则会覆盖现有安装。想加ssl模块的话第一次装就该带上--with-http_ssl_module——事后加需要重新编译二进制并平滑替换。防火墙不要一关了之。测试环境systemctl stop firewalld图省事可以理解生产必须精确到端口放行。下一篇看Nginx安装后的目录结构搞清楚conf、html、logs、sbin四个目录各自放什么以及nginx.conf为什么是后续所有配置的唯一入口。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑