资讯动态

03-Nginx环境搭建、编译安装、Docker部署、开机自启与运维

发布时间:2026/8/22 21:16:39 来源:尧图企业网站定制
03-Nginx环境搭建、编译安装、Docker部署、开机自启与运维作者黒漂技术佬系列专栏Nginx高可用部署与三端项目实战一、Nginx 三种安装方式横向对比生产环境装 Nginx常见三种路子。先把对比摆出来你心里有谱了再选方式难度版本灵活度适用场景yum/apt 包管理低旧仓库源滞后低模块固定快速验证、开发测试编译安装中新官网最新高自定义模块生产环境主流Docker 部署中中等中依赖宿主机配置容器化/云原生场景为什么生产上更推荐编译安装两个原因yum 源的 Nginx 版本严重滞后——比如 CentOS 7 的 epel 源给的还是 1.20 系列Nginx 官方早就迭代到 1.25 了很多新特性HTTP/3 雏形、新安全补丁用不上编译安装可以按需启用第三方模块——比如 Brotli 压缩、Lua 扩展、Prometheus 监控 exporter这些是包管理装不上的下面三种方式都走一遍你看哪种适合自家场景。二、yum 安装最快但最受限适合本地起个测试机两分钟搞定。# CentOS / RHELyuminstall-yepel-release yuminstall-ynginx# Ubuntu / Debianaptupdateaptinstall-ynginx# 启动 开机自启systemctl start nginx systemctlenablenginx装完验证浏览器访问服务器 IP 看到 Nginx 默认欢迎页就成了。致命缺点版本老、模块固化、SSL 库版本可能跟不上 TLS 1.3 的要求。生产别用这方式。三、编译安装生产环境的主流选择这是本篇重点参数逐个讲清。1. 准备编译环境# 安装编译工具链和依赖库yuminstall-ygcc gcc-cmakeautomake autoconf libtool pcre pcre-devel\zlib zlib-devel openssl openssl-devel各依赖是干嘛的gcc/makeC 编译器和构建工具pcre/pcre-devel正则表达式库Nginx 的 location 重写规则就靠它zlib/zlib-develgzip 压缩依赖openssl/openssl-develHTTPS 模块依赖2. 下载源码cd/usr/local/srcwgethttps://nginx.org/download/nginx-1.25.4.tar.gztar-zxvfnginx-1.25.4.tar.gzcdnginx-1.25.43. configure 配置参数详解这是编译安装的灵魂./configure一堆参数决定装哪些模块、装到哪。逐个说./configure\--prefix/usr/local/nginx\# 安装根目录--sbin-path/usr/local/nginx/sbin/nginx\# 二进制路径--conf-path/usr/local/nginx/conf/nginx.conf\# 主配置路径--error-log-path/usr/local/nginx/logs/error.log\# 错误日志路径--http-log-path/usr/local/nginx/logs/access.log\# 访问日志路径--pid-path/usr/local/nginx/logs/nginx.pid\# pid 文件路径--lock-path/var/lock/nginx.lock\# 锁文件路径--usernginx\# worker 运行用户--groupnginx\# worker 运行组--with-http_ssl_module\# 启用 HTTPS 模块--with-http_v2_module\# 启用 HTTP/2--with-http_realip_module\# 启用真实 IP 获取--with-http_stub_status_module\# 启用状态监控--with-http_gzip_static_module\# 启用预压缩静态文件--with-threads\# 启用线程池--with-file-aio\# 启用异步文件 IO--with-stream\# 启用 TCP/UDP 代理设备MQTT场景用--with-stream_ssl_module# 启用 stream 模块 SSL为什么售货柜项目要带--with-stream因为后端 MQTT设备物联网长连接走的是 TCP需要 Nginx 在 4 层做代理分发stream 模块就是干这个的yum 装的版本默认没带。configure 跑完会输出一个配置摘要仔细看看再编译nginx path prefix: /usr/local/nginx nginx binary file: /usr/local/nginx/sbin/nginx ... http ssl module: yes http v2 module: yes stream module: yes4. 编译安装makemakeinstall5. 创建运行用户useradd-s/sbin/nologin-Mnginx-M不创建家目录、-s /sbin/nologin禁止登录纯跑 Worker 用的最小权限账户安全实践。6. 验证启动/usr/local/nginx/sbin/nginx-t# 校验配置语法/usr/local/nginx/sbin/nginx# 启动curl-Ihttp://localhost# 测试访问四、Docker 部署云原生的优雅方式容器化部署的好处是配置即代码、环境可复现CI/CD 友好。1. 直接拉官方镜像跑最简方式dockerrun-d\--namenginx\-p80:80-p443:443\-v/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf\-v/data/nginx/conf/conf.d:/etc/nginx/conf.d\-v/data/nginx/html:/usr/share/nginx/html\-v/data/nginx/logs:/var/log/nginx\-v/data/nginx/ssl:/etc/nginx/ssl\--restartalways\nginx:1.25.4几个挂载点的意义配置文件nginx.conf挂出来改配置不用进容器conf.d 目录把 server 块拆成多个独立文件方便管理静态资源html目录挂出来前端构建产物直接拷进去日志挂到宿主机方便日志采集工具Filebeat/Promtail抓证书SSL 证书挂进去集中管理–restartalways宿主机重启或容器崩了自动拉起2. 用 Dockerfile 自定义镜像如果你的 Nginx 需要内置特殊模块比如 lua-nginx-module用 Dockerfile 自定义FROM nginx:1.25.4 # 移除默认配置 RUN rm /etc/nginx/conf.d/default.conf # 拷贝自定义配置 COPY nginx.conf /etc/nginx/nginx.conf COPY conf.d/ /etc/nginx/conf.d/ # 拷贝静态资源和证书 COPY html/ /usr/share/nginx/html/ COPY ssl/ /etc/nginx/ssl/ EXPOSE 80 443 CMD [nginx, -g, daemon off;]注意daemon off;这一行是 Docker 跑 Nginx 的命门Docker 要求容器主进程必须前台运行Nginx 默认是 daemon 模式启动即后台化不加daemon off;容器启动后主进程立刻退出容器就跟着挂了。五、systemd 开机自启配置编译安装的 Nginx 默认不注册 systemd要手动写 service 文件。1. 创建 service 文件vim/etc/systemd/system/nginx.service内容[Unit] Descriptionnginx - high performance web server Documentationhttp://nginx.org/en/docs/ Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking PIDFile/usr/local/nginx/logs/nginx.pid ExecStartPre/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s stop ExecQuit/usr/local/nginx/sbin/nginx -s quit PrivateTmptrue [Install] WantedBymulti-user.target关键点解释TypeforkingNginx 启动后会 fork 出 masterworker主进程后台化对应 forking 类型PIDFilesystemd 靠这个文件追踪主进程 PIDExecStartPre启动前先nginx -t校验配置配置错就不让启动避免线上配置语法错误导致 Nginx 起不来ExecReloadsystemctl reload nginx实际调用的就是这条ExecQuit优雅退出等已有连接处理完再停2. 启用并验证systemctl daemon-reload# 重新加载 systemdsystemctlenablenginx# 开机自启systemctl start nginx# 启动systemctl status nginx# 查看状态systemctl status输出看到active (running)就成了。六、日常运维命令速查表线上干活必背的几条命令作用何时用nginx -t校验配置语法改完配置必跑nginx -T打印当前生效配置排查配置到底用的哪份nginx -s reload热重载配置不中断连接改完配置生效nginx -s reopen重新打开日志文件日志轮转后用nginx -s stop立即停止粗暴紧急停服nginx -s quit优雅停止等连接处理完计划内停服nginx -V查看编译参数和模块排查为啥某模块没生效reload 是命根子命令Nginx 热重载的本质是 Master 进程读取新配置fork 一批新 Worker 处理新连接老 Worker 处理完存量连接后优雅退出。整个过程对外连接零中断这就是 Nginx 在线上7x24 不停服改配置的底气。reload 的坑如果新配置有语法错误reload不会生效但也不会让正在运行的 Nginx 挂掉这点比很多中间件友好。但reload 不会重新加载 SSL 证书——证书更新后必须nginx -s stop nginx全停再起或者用kill -USR2做热升级二进制。七、日志轮转配置Nginx 默认 access.log 单文件增长跑几个月就上 GB影响查询也占磁盘。必须配日志轮转。1. 用 logrotate 工具vim/etc/logrotate.d/nginx内容/usr/local/nginx/logs/*.log { daily # 每天轮转 rotate 30 # 保留30天 missingok # 日志不存在不报错 compress # 旧日志 gzip 压缩 delaycompress # 延迟一天压缩避免刚轮转就被压 notifempty # 空文件不轮转 sharedscripts # 多个日志共享 postrotate 脚本 postrotate /usr/local/nginx/sbin/nginx -s reopen # 关键通知 Nginx 重开日志文件 endscript }postrotate 那行是核心logrotate 把 access.log 改名为 access.log-20260811 后Nginx 还在往旧文件句柄写必须nginx -s reopen让 Nginx 重新打开新文件句柄否则新日志写到被删的旧文件里Linux 文件被删但句柄还在磁盘空间不会被释放这是个经典坑。2. 手动测试轮转logrotate-d/etc/logrotate.d/nginx# dry-run 模拟跑一遍logrotate-f/etc/logrotate.d/nginx# 强制执行一次生产上建议配个 cron 定时跑或者交给系统自带的/etc/cron.daily/logrotate。八、小结这一篇落地实操对比了 yum/编译/Docker 三种安装方式详解了编译安装的./configure关键参数特别是售货柜项目必备的 stream 模块给出了 Docker 部署的挂载策略和 Dockerfile 写法强调daemon off;的命门配置了 systemd 开机自启 service 文件最后列了日常运维命令速查表和 logrotate 日志轮转的坑reopen 那一环不能漏。下一篇进入配置实战把 nginx.conf 的全局块、http 块、server 块、location 匹配规则逐层拆开讲透。

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

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

免费获取报价