三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CentOS 7下Nginx部署全攻略:从安装到企业级应用

CentOS 7下Nginx部署全攻略:从安装到企业级应用

1. 项目概述:为什么是CentOS 7与Nginx的组合?

如果你在运维或者开发岗位上待过一阵子,大概率会碰到一个经典场景:需要在一台干净的CentOS 7服务器上,快速、稳定地部署一个Web服务。这时候,Nginx往往会成为首选。这个组合之所以经典,甚至到今天依然有大量教程和需求,背后有几个很实际的原因。

首先,CentOS 7虽然已经停止主流维护,转向CentOS Stream,但在国内大量企业、云服务商和遗留系统中,它依然是一个“稳定”的代名词。很多生产环境的镜像、部署脚本和运维规范都是基于CentOS 7构建的,短期内完全迁移的成本很高。因此,掌握在CentOS 7上的基础服务部署,仍然是一项非常实用的技能。

其次,Nginx作为一款高性能的HTTP和反向代理服务器,其地位无需多言。它轻量、并发处理能力强、配置相对清晰,无论是用来托管静态网站、作为后端服务的反向代理,还是做负载均衡,都是非常可靠的选择。对于新手来说,从Nginx入手理解Web服务器的工作机制,也比直接面对一些更复杂的应用服务器要友好得多。

所以,“在CentOS 7上安装Nginx”这个动作,本质上是在一个公认稳定的操作系统基座上,搭建一个同样以稳定高效著称的网络服务入口。这个过程看似简单,但里面涉及了Linux权限管理、软件包管理(yum)、服务管理(systemd)、防火墙配置(firewalld)以及最基本的Nginx配置理解。搞明白这一套,不仅是完成一次安装,更是打通了从系统到服务的关键路径。接下来,我会带你走一遍最清晰、最稳妥的安装流程,并分享一些只有实际部署过多次才会知道的细节和坑点。

2. 安装前的关键准备与决策

在真正执行安装命令之前,花几分钟做好准备工作,能避免后面很多莫名其妙的问题。这一步往往被新手忽略,但恰恰是资深运维会特别关注的地方。

2.1 系统环境确认与基础优化

拿到一台CentOS 7服务器,第一件事不是急着安装,而是先看看它的状态。通过cat /etc/redhat-release确认系统版本确实是CentOS 7。然后,运行uname -r查看内核版本。虽然安装Nginx对内核版本要求不高,但了解系统全貌是个好习惯。

接下来,一个至关重要的操作是更新系统基础软件包。执行sudo yum update -y。这个操作有两个目的:一是确保系统现有的软件包都处于最新状态,减少因依赖包版本过低导致的潜在冲突;二是刷新yum的元数据缓存,让后续安装操作能获取到最新的软件源信息。特别是在使用一些云服务商提供的镜像时,初始的软件源缓存可能不是最新的。

另一个准备工作是检查并设置正确的主机名(hostname)。虽然不影响Nginx安装,但会影响后续配置文件中可能用到的域名,以及系统日志的标识。使用hostnamectl set-hostname your-hostname进行设置,并修改/etc/hosts文件,确保127.0.0.1指向了正确的主机名,避免某些情况下服务启动出现警告。

2.2 软件源的选择:EPEL仓库的引入

CentOS 7自带的官方yum源(Base和Updates仓库)提供的软件版本通常比较保守,以稳定为主。默认情况下,这些源里可能没有Nginx,或者提供的Nginx版本非常老旧。因此,我们需要引入一个非常重要的第三方仓库:EPEL(Extra Packages for Enterprise Linux)。

EPEL是由Fedora社区维护的,为RHEL/CentOS等系统提供高质量附加软件包的仓库。Nginx的官方稳定版通常就在EPEL仓库里。添加EPEL源非常简单:

sudo yum install -y epel-release

安装成功后,你可以通过yum repolist命令查看是否多出了epel仓库。这是最推荐新手使用的方式,因为EPEL仓库的软件经过社区充分测试,与CentOS系统兼容性好,且能通过yum统一管理,后续升级维护非常方便。

当然,如果你追求最新的Nginx版本,也可以使用Nginx官方提供的yum源。这需要手动创建repo文件,但带来的问题是,你需要信任并管理非系统官方的软件源,在稳定性优先的生产环境中需谨慎评估。对于绝大多数应用场景,EPEL仓库提供的Nginx稳定版已经完全足够。

2.3 防火墙与SELinux的预判

CentOS 7默认开启了firewalld防火墙和SELinux安全模块。这两者常常是服务安装好后却无法访问的“罪魁祸首”。我们需要提前规划好策略。

对于firewalld,我们需要放行HTTP(80端口)和HTTPS(443端口)流量。可以在安装前就执行:

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload

--permanent参数表示将规则永久生效,--reload是重载配置使其立即生效。你可以用firewall-cmd --list-all来验证规则是否添加成功。

对于SELinux,情况稍微复杂。SELinux是一套强大的强制访问控制安全系统,但它严格的策略可能会阻止Nginx访问其网页根目录、日志目录等。对于学习或测试环境,一个常见的做法是将其设置为“宽容模式”或直接禁用。但这在生产环境中是不推荐的。更佳实践是学习并配置正确的SELinux上下文(context)。我们可以在安装后,根据Nginx需要访问的实际目录来设置。例如,如果你将网页文件放在非标准目录(如/data/www),就需要使用semanage fcontextrestorecon命令来修改该目录的安全上下文。我们会在后续配置部分详细说明。

3. 两种主流安装方式详解与实操

安装Nginx主要有两种途径:通过yum包管理器安装,以及从源代码编译安装。它们各有优劣,适用于不同的场景。

3.1 使用Yum安装:最推荐的高效稳定方案

对于绝大多数情况,尤其是刚入门和追求稳定部署的场景,通过yum安装是最佳选择。它自动化程度高,能自动处理依赖关系,并且方便后续升级和管理。

在已经添加EPEL仓库的前提下,安装命令非常简单:

sudo yum install -y nginx

这个命令会自动从EPEL仓库下载Nginx及其所有依赖包(如PCRE、zlib、OpenSSL等)并进行安装。安装过程无需人工干预,yum会处理好一切。

安装完成后,我们需要启动Nginx服务,并设置开机自启。CentOS 7使用systemd管理系统服务,相关命令如下:

sudo systemctl start nginx # 启动Nginx服务 sudo systemctl enable nginx # 设置开机自动启动 sudo systemctl status nginx # 查看Nginx服务状态

执行status命令后,如果看到active (running)的字样,并且下面没有红色的错误日志,就说明服务已经成功启动。

此时,你可以在服务器本机使用curl http://localhost测试,或者在另一台机器上用浏览器访问服务器的IP地址。如果看到“Welcome to nginx!”的默认页面,恭喜你,Nginx已经安装并运行成功了。

实操心得:使用yum安装后,Nginx的配置文件通常位于/etc/nginx/目录下,主配置文件是nginx.conf。网页的默认根目录是/usr/share/nginx/html。日志文件(访问日志和错误日志)位于/var/log/nginx/。记住这几个关键路径,后续的配置和排查都会用到。

3.2 编译安装:追求极致定制与最新特性

编译安装适用于有特殊需求的场景,比如你需要使用最新的主线版本(Mainline)、需要启用或禁用某些特定的内置模块(如需要更完整的HTTP/2支持、特定的第三方模块如ngx_http_substitutions_filter_module),或者希望对安装路径有完全的控制。

编译安装的过程比yum安装复杂得多,主要包括以下步骤:

  1. 安装编译工具和依赖库:这是编译的基础。

    sudo yum groupinstall -y "Development Tools" sudo yum install -y pcre-devel zlib-devel openssl-devel

    pcre-devel(Perl兼容正则表达式库)、zlib-devel(压缩库)、openssl-devel(加密库)是编译Nginx的核心依赖。

  2. 下载Nginx源代码:前往Nginx官网(nginx.org)下载最新的稳定版(Stable)或主线版(Mainline)源代码包。使用wget命令下载到服务器上。

    wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0
  3. 配置编译选项:这是编译安装的核心步骤,决定了Nginx的功能和性能。使用./configure命令进行配置。

    ./configure \ --prefix=/usr/local/nginx \ # 指定安装目录 --user=nginx \ # 指定运行用户 --group=nginx \ # 指定运行用户组 --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 \ # 启用gzip静态压缩模块 --with-pcre \ # 启用PCRE支持(用于正则表达式) --with-stream # 启用TCP/UDP代理模块

    你可以通过./configure --help查看所有可用的模块选项。配置完成后,会生成一个Makefile文件。

  4. 编译与安装

    make # 编译 sudo make install # 安装到指定的 --prefix 目录
  5. 创建系统服务:编译安装不会自动生成systemd服务文件。我们需要手动创建一个。在/etc/systemd/system/目录下创建文件nginx.service,内容如下:

    [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target

    然后执行sudo systemctl daemon-reload重载systemd配置,之后就可以用systemctl start nginx来管理了。

注意事项:编译安装给了你最大的灵活性,但也带来了更大的维护成本。你需要自己管理依赖库的升级、Nginx版本的安全更新(需要重新下载、编译、替换),服务管理脚本也需要自己维护。除非你有明确的定制化需求,否则对于生产环境,yum安装是更稳妥、更省心的选择。

4. 安装后的核心配置与基础调优

安装成功只是第一步,让Nginx按照你的意愿工作才是关键。这里我们深入几个最核心的配置环节。

4.1 理解Nginx配置文件结构

Nginx的配置文件具有清晰的层次结构,采用类似C语言的语法。以yum安装为例,主要配置文件如下:

  • /etc/nginx/nginx.conf:主配置文件,包含全局设置(如worker进程数、日志格式等)以及http块。
  • /etc/nginx/conf.d/:这是一个目录,通常用于存放自定义的服务器块(server block,相当于虚拟主机)配置。nginx.conf中的http块会通过include /etc/nginx/conf.d/*.conf;指令将这里的所有.conf文件包含进来。这是推荐放置网站配置的地方,便于管理。
  • /etc/nginx/default.d/:某些发行版或安装方式可能会用到,但不如conf.d通用。

一个最基本的、用于托管静态网站的服务器块配置,可以放在/etc/nginx/conf.d/mysite.conf里:

server { listen 80; # 监听80端口 server_name your-domain.com www.your-domain.com; # 你的域名,没有域名可以用服务器IP或localhost # 网页根目录 root /usr/share/nginx/html/mysite; index index.html index.htm; # 访问日志和错误日志(可选,不配置则使用全局设置) access_log /var/log/nginx/mysite.access.log; error_log /var/log/nginx/mysite.error.log; location / { try_files $uri $uri/ =404; # 尝试寻找请求的文件,找不到则返回404 } # 禁止访问 .ht 开头和 .git 目录的文件 location ~ /\.(ht|git) { deny all; } }

每次修改配置文件后,必须使用sudo nginx -t命令测试配置文件语法是否正确。如果显示 “syntax is ok” 和 “test is successful”,才可以重新加载配置:sudo systemctl reload nginxreload是平滑重载,不会中断正在处理的连接,是生产环境推荐的方式。

4.2 关键性能参数调优

/etc/nginx/nginx.conf的全局部分,有几个参数对性能影响较大,可以根据服务器硬件进行调整:

  1. worker_processes:工作进程数。通常设置为与服务器CPU核心数相等。你可以通过grep processor /proc/cpuinfo | wc -l查看核心数。对于计算密集型(如SSL握手)的场景,可以设置得更高一些。

    worker_processes auto; # 使用auto让Nginx自动检测,通常是个好选择
  2. worker_connections:每个工作进程可以同时处理的最大连接数。这个值在events块中设置。它决定了Nginx的并发处理能力。最大客户端连接数 =worker_processes*worker_connections

    events { worker_connections 1024; # 默认是1024,对于高并发场景可以调高,如4096 use epoll; # 在Linux上使用高效的epoll事件模型 }
  3. keepalive_timeout:客户端与服务器之间长连接保持的时间。适当增加可以减少TCP连接建立和断开的开销,提升性能,但设置过长会占用服务器资源。通常设置在65-75秒。

    http { keepalive_timeout 65; ... }

实操心得:性能调优没有银弹。最好的方法是结合监控(如Nginx的stub_status模块、服务器资源监控)和实际压力测试,观察连接数、CPU、内存等指标,再进行针对性调整。一开始可以使用默认值或上述建议值,等业务量上来后再做精细优化。

4.3 妥善处理SELinux上下文

如果你将网站文件放在了非默认目录(比如/data/www),即使Nginx配置和文件权限都正确,也可能因为SELinux而返回“403 Forbidden”错误。这是因为SELinux策略禁止Nginx进程访问该目录。

正确的处理方式是修改目录的SELinux安全上下文,使其允许HTTP服务访问:

# 1. 安装SELinux管理工具(如果未安装) sudo yum install -y policycoreutils-python # 2. 将目标目录的默认上下文设置为httpd_sys_content_t(Web内容类型) sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?" # 3. 应用新的上下文规则到目录及其所有子内容 sudo restorecon -Rv /data/www

完成以上步骤后,Nginx就能正常读取/data/www下的文件了。永远不要在生产环境简单地禁用SELinux,学习管理它是Linux系统安全的重要一环。

5. 企业级应用场景拓展

Nginx远不止是一个静态文件服务器。它在现代Web架构中扮演着更重要的角色。

5.1 作为反向代理与负载均衡器

这是Nginx最核心的企业级功能之一。假设你有一个运行在localhost:8080的Java Spring Boot或Python Django应用,你可以通过Nginx将外部80端口的请求转发给它,并可以实现负载均衡。

/etc/nginx/conf.d/proxy.conf中配置:

upstream backend_servers { # 定义上游服务器组,可以配置权重、健康检查等 server 127.0.0.1:8080 weight=3; # 本机应用,权重3 server 192.168.1.100:8080 weight=2; # 另一台服务器,权重2 server 192.168.1.101:8080 backup; # 备份服务器,当上面两台都不可用时启用 } server { listen 80; server_name api.your-domain.com; location / { proxy_pass http://backend_servers; # 关键指令,将请求转发给上游组 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

proxy_set_header指令用于将客户端的真实信息传递给后端应用,这对于日志记录、IP限制等功能至关重要。

5.2 配置HTTPS与HTTP/2

如今,为网站启用HTTPS已是标配。你可以使用Let‘s Encrypt等免费证书颁发机构(CA)获取证书。获取证书后(假设证书文件为fullchain.pem,私钥为privkey.pem),配置如下:

server { listen 443 ssl http2; # 同时启用SSL和HTTP/2 server_name your-domain.com; ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/private/privkey.pem; # 强化的SSL配置(示例,需根据安全要求调整) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ... # 其他location配置 } # 将HTTP请求重定向到HTTPS server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; }

启用HTTP/2(http2参数)可以显著提升页面加载性能,尤其是在需要加载大量小资源的场景下。

5.3 动静分离与缓存策略

对于动态网站(如WordPress),可以将静态资源(图片、CSS、JS)的请求分离出来,由Nginx直接处理,并设置浏览器缓存,减轻后端应用服务器的压力。

server { ... location / { proxy_pass http://backend; # 动态请求转发给后端 } location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { root /path/to/static/files; expires 30d; # 告诉浏览器缓存30天 add_header Cache-Control "public, immutable"; access_log off; # 可选,关闭静态资源访问日志以减少磁盘IO } }

expires指令用于设置HTTP响应头中的ExpiresCache-Control,引导浏览器进行缓存。immutable属性告诉浏览器,在资源过期前,即使用户刷新页面,也不要向服务器验证该资源是否已修改,这对于带有哈希值的静态资源文件名非常有效。

6. 运维监控与故障排查实录

服务上线后,持续的监控和高效的故障排查是保障稳定的关键。

6.1 启用状态监控模块

如果你在编译时加入了--with-http_stub_status_module,或者在yum安装的版本中该模块已默认启用,你可以配置一个内部接口来获取Nginx的基本状态信息。

server { listen 80; server_name status.localhost; # 用一个内部域名或特定IP访问 location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本机访问,非常重要! allow 192.168.1.0/24; # 或者允许你的内网网段 deny all; } }

访问这个地址,你会看到一个简单的文本页面,包含:

Active connections: 3 server accepts handled requests 10 10 20 Reading: 0 Writing: 1 Waiting: 2
  • Active connections:当前活跃客户端连接数。
  • accepts:已接受的客户端连接总数。
  • handled:已处理的连接总数。
  • requests:客户端请求的总数。
  • Reading:正在读取请求头的连接数。
  • Writing:正在向客户端写入响应的连接数。
  • Waiting:空闲的客户端连接数(已处理完请求,等待新请求)。

这些数据可以接入Zabbix、Prometheus等监控系统,用于绘制连接数、QPS(每秒请求数)等趋势图。

6.2 日志分析与常用排查命令

Nginx的访问日志和错误日志是排查问题的第一现场。日志格式可以在nginx.confhttp块中通过log_format指令自定义。

一些极其有用的排查命令:

  • 实时查看错误日志sudo tail -f /var/log/nginx/error.log。当页面出现502、504等错误时,第一时间看这里。
  • 实时查看访问日志sudo tail -f /var/log/nginx/access.log。可以观察请求流量、响应状态码。
  • 根据状态码过滤日志sudo awk '$9==502 {print $0}' /var/log/nginx/access.log,快速找出所有502错误的请求。
  • 查看当前Nginx进程状态sudo ps aux | grep nginx,确认master和worker进程是否正常运行。
  • 测试配置文件每次修改配置后必做sudo nginx -t
  • 平滑重启sudo systemctl reload nginxsudo nginx -s reload
  • 强制停止sudo systemctl stop nginxsudo nginx -s stop

6.3 常见问题与解决方案速查表

下面这个表格整理了我遇到过的一些典型问题及其解决思路:

问题现象可能原因排查步骤与解决方案
访问服务器IP,显示“Welcome to nginx”正常,默认站点已启动。无需处理,开始配置你自己的网站即可。
访问显示 “403 Forbidden”1. 网页根目录权限不足。
2.SELinux上下文不正确
3. 目录索引文件(如index.html)不存在且配置未允许列出目录。
1.ls -la检查目录权限,确保Nginx用户(通常是nginx)有读取权限。
2. 检查SELinux:ls -Z /path/to/webroot,使用semanagerestorecon修复。
3. 确认index指令指定的文件存在,或autoindex指令是否开启。
访问显示 “502 Bad Gateway”反向代理的后端服务未启动或无法连接。1. 检查后端应用(如Tomcat、Node.js)是否在运行:systemctl status your-app
2. 检查后端服务的监听端口是否正确,是否只监听了127.0.0.1(需改为0.0.0.0)。
3. 检查服务器防火墙是否放行了后端端口。
访问显示 “504 Gateway Time-out”反向代理时,后端服务处理超时。1. 在Nginx的location块中增加代理超时设置:proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s;
2. 优化后端应用性能,减少响应时间。
修改配置后nginx -t报错配置文件语法错误。根据错误提示的行号和内容检查配置文件,常见错误包括缺少分号;、括号不匹配、指令拼写错误等。
systemctl start nginx失败1. 80端口被其他程序(如Apache)占用。
2. 配置文件有错误但未检查。
1. 检查端口占用:`sudo netstat -tlnp
静态资源(CSS/JS)无法加载1. 文件路径配置错误。
2. MIME类型未正确识别。
3. 浏览器缓存了旧的错误资源。
1. 检查rootalias指令路径是否正确。
2. 确保Nginx的mime.types文件包含相应类型,或手动添加types { text/css css; }
3. 浏览器强制刷新(Ctrl+F5)。
日志文件急剧增大访问量增大或存在异常扫描、攻击。1. 定期日志切割:使用logrotate工具(通常已为Nginx配置好)。
2. 分析日志,对异常IP进行限速或封禁。可在Nginx层面使用limit_req_zonelimit_req指令。

最后再分享一个小技巧:对于复杂的Nginx配置,我习惯在/etc/nginx/conf.d/下为每个网站或服务创建一个独立的.conf文件,并用有意义的文件名命名,比如blog.confapi-gateway.conf。这样管理起来非常清晰,要禁用某个站点只需重命名文件(如加.bak后缀)并重载Nginx即可,完全不需要动主配置文件。这种模块化的管理方式在维护多个服务时尤其高效。

← 返回列表