CentOS7下的Nginx部署

一、Nginx 概述:高性能 Web 服务的基石

1.1 Nginx 的定位与核心优势

Nginx(发音为 “engine x”)是一款开源的高性能 HTTP 和反向代理服务器,由俄罗斯工程师 Igor Sysoev 开发,于 2004 年首次发布。其设计目标是解决 C10K 问题(支持 1 万并发连接),凭借轻量级、高并发、低内存占用等特性,成为现代 Web 架构的核心组件。

核心功能

  • 静态资源服务:高效处理 HTML、CSS、JS、图片等静态文件。
  • 反向代理与负载均衡:分发客户端请求到后端服务器集群,支持轮询、最小连接数等策略。
  • API 网关与流量控制:作为微服务架构的入口,实现限流、熔断、路由转发。
  • SSL/TLS 加密:通过 HTTPS 保障数据传输安全,支持 HTTP/2 和 QUIC 协议。

典型应用场景

  • 静态网站托管(如博客、企业官网)。
  • 动态应用反向代理(如 Node.js/PHP/Java 后端)。
  • 高并发场景下的负载均衡(如电商大促、直播平台)。
  • 边缘计算与 CDN 节点(减少源站压力,提升用户访问速度)。

二、环境准备:系统配置与依赖安装

2.1 操作系统选择

Nginx 支持主流 Linux 发行版,推荐以下环境:

  • CentOS 7/8:稳定性强,适合企业级部署。
  • Ubuntu 20.04/22.04:社区活跃,包管理便捷。
  • Alpine Linux:轻量级系统,适合容器化部署(如 Docker)。

硬件要求

  • 最低配置:1 核 CPU、1GB 内存、20GB 磁盘(适用于测试环境)。
  • 生产环境:4 核 CPU、8GB + 内存、SSD 磁盘(根据流量动态扩展)。

2.2 系统优化

2.2.1 关闭防火墙(测试环境)

bash

systemctl stop firewalld && systemctl disable firewalld  # CentOS
ufw disable  # Ubuntu
2.2.2 配置 YUM/APT 仓库

CentOS/RHEL

bash

yum install -y yum-utils  # 安装仓库工具
vim /etc/yum.repos.d/nginx.repo  # 创建Nginx仓库文件

填入以下内容:

ini

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ubuntu/Debian

bash

apt update && apt install -y apt-transport-https gnupg2
wget -qO- https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | tee /etc/apt/sources.list.d/nginx.list
apt update

三、Nginx 安装与基本配置

3.1 安装最新稳定版

3.1.1 通过包管理器安装

CentOS

bash

yum install -y nginx  # 安装Nginx

Ubuntu

bash

apt install -y nginx  # 安装Nginx
3.1.2 手动编译安装(可选)

适用于需要定制模块的场景:

bash

wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream  # 启用SSL和流模块
make && make install

3.2 服务启停与状态检查

3.2.1 控制命令

bash

systemctl start nginx       # 启动
systemctl stop nginx        # 停止
systemctl restart nginx     # 重启
systemctl reload nginx      # 重新加载配置
systemctl enable nginx      # 开机自启
systemctl status nginx      # 查看状态
3.2.2 验证安装

访问服务器 IP 或域名,若看到默认页面 “Welcome to nginx!”,表示安装成功。

bash

curl http://localhost  # 命令行验证

四、核心配置文件详解

Nginx 配置文件采用分层结构,主配置文件为/etc/nginx/nginx.conf(默认路径),主要分为以下部分:

4.1 全局块

配置影响 Nginx 全局的指令,如用户、进程数、错误日志路径:

nginx

user  nginx;          # 运行用户(默认nginx用户,需提前创建)
worker_processes  4;  # 工作进程数,建议与CPU核心数一致
error_log  /var/log/nginx/error.log warn;  # 错误日志级别
pid        /var/run/nginx.pid;  # 进程ID文件

4.2 Events 块

配置工作进程的网络连接模型:

nginx

events {
    worker_connections  10240;  # 每个进程最大连接数(默认1024)
    use epoll;                 # 使用epoll事件驱动(Linux推荐)
    multi_accept on;           # 允许同时接受多个连接
}

4.3 HTTP 块

核心配置模块,包含 HTTP 协议相关指令和虚拟主机配置:

nginx

http {
    include       /etc/nginx/mime.types;  # 媒体类型定义
    default_type  application/octet-stream;  # 默认文件类型

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';  # 日志格式

    access_log  /var/log/nginx/access.log  main;  # 访问日志路径

    sendfile        on;        # 启用零拷贝传输
    tcp_nopush      on;        # 合并网络包,提升传输效率
    tcp_nodelay     on;        # 禁用Nagle算法,适用于实时数据

    keepalive_timeout  65;     # 长连接超时时间

    # 虚拟主机配置(示例)
    server {
        listen       80;        # 监听端口
        server_name  example.com;  # 域名

        location / {
            root   /usr/share/nginx/html;  # 网站根目录
            index  index.html index.htm;  # 默认索引文件
        }

        error_page   500 502 503 504  /50x.html;  # 错误页面
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

五、虚拟主机与反向代理配置

5.1 单服务器多站点(虚拟主机)

5.1.1 基于域名的虚拟主机

nginx

server {
    listen 80;
    server_name site1.com;
    root /var/www/site1;
    index index.html;
}

server {
    listen 80;
    server_name site2.com;
    root /var/www/site2;
    index index.php;  # 支持PHP动态站点(需配合FastCGI)
}
5.1.2 基于端口的虚拟主机

nginx

server {
    listen 8080;
    server_name localhost;
    root /var/www/app;
}

5.2 反向代理与负载均衡

5.2.1 基本反向代理配置

nginx

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;  # 代理到后端Node.js服务
        proxy_set_header Host $host;        # 传递原始Host头
        proxy_set_header X-Real-IP $remote_addr;  # 传递真实IP
    }
}
5.2.2 负载均衡策略

轮询(默认)

nginx

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

最小连接数

nginx

upstream backend {
    least_conn;  # 切换至最小连接数策略
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

IP 哈希(会话保持)

nginx

upstream backend {
    ip_hash;  # 相同IP请求转发到同一服务器
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

六、性能优化与安全加固

6.1 连接与超时优化

nginx

http {
    keepalive_requests 1000;  # 单连接最大请求数
    proxy_connect_timeout 30s;  # 代理连接超时
    proxy_read_timeout 60s;     # 代理读取超时
    send_timeout 60s;          # 响应超时
}

6.2 Gzip 压缩

启用 Gzip 减少带宽占用:

nginx

http {
    gzip on;
    gzip_min_length 1k;                # 最小压缩文件大小
    gzip_comp_level 6;                 # 压缩级别(1-9,默认6)
    gzip_types text/plain text/css application/json;  # 压缩类型
    gzip_vary on;                      # 启用Vary头,让CDN正确缓存压缩内容
}

6.3 静态资源缓存

配置浏览器缓存策略:

nginx

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 7d;       # 缓存7天
    add_header Cache-Control "public";  # 允许公共缓存
    access_log off;   # 关闭静态资源日志
}

6.4 安全加固措施

6.4.1 隐藏版本号

nginx

server_tokens off;  # 移除响应头中的Nginx版本信息
6.4.2 限制访问频率

使用limit_req模块防止 CC 攻击:

nginx

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;  # 定义限速区域

    server {
        location / {
            limit_req zone=one burst=20 nodelay;  # 突发请求限制
        }
    }
}
6.4.3 启用 HTTPS

nginx

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.crt;  # SSL证书路径
    ssl_certificate_key /etc/ssl/private/example.key;  # 私钥路径
    ssl_protocols TLSv1.2 TLSv1.3;  # 禁用老旧协议
    ssl_prefer_server_ciphers on;    # 优先使用服务器加密算法
}

七、常见问题与解决方案

7.1 启动失败

常见原因

  • 端口被占用(如 80 端口被其他程序监听):

    bash

    lsof -i :80  # 查看端口占用
    kill -9 <PID>  # 终止进程
    
  • 配置文件语法错误:

    bash

    nginx -t  # 检测配置文件
    nginx -s reload  # 重新加载配置
    

7.2 反向代理异常

排查步骤

  1. 检查后端服务器是否正常运行(如curl http://backend:port)。
  2. 查看 Nginx 错误日志(/var/log/nginx/error.log),确认代理路径是否正确。
  3. 检查跨域问题,添加 CORS 头:

    nginx

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    

7.3 高并发下性能瓶颈

优化方向

  • 增加worker_processesworker_connections
  • 启用sendfiletcp_nopush提升传输效率。
  • 使用spawn_fcgiuwsgi优化动态请求处理。

八、Nginx 监控与日志分析

8.1 内置状态页

配置监控端点:

nginx

location /status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;  # 仅允许本地访问
    deny all;
}

访问http://server/status查看状态:

plaintext

Active connections: 123
server accepts handled requests
 123456 123456 12345678
Reading: 1 Writing: 2 Waiting: 100  # 读写等待连接数

8.2 日志分析工具

  • AWK/Sed:过滤特定请求

    bash

    awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c  # 统计URI访问次数
    
  • GoAccess:实时可视化分析

    bash

    goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED  # 生成HTML报告
    
  • ELK Stack:集中式日志管理
    通过 Filebeat 收集日志,发送至 Elasticsearch,利用 Kibana 可视化。

九、容器化部署(Docker 实战)

9.1 创建 Dockerfile

dockerfile

FROM nginx:alpine  # 使用官方轻量级镜像
COPY nginx.conf /etc/nginx/nginx.conf  # 复制自定义配置
COPY html/ /usr/share/nginx/html/      # 复制静态资源
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]

9.2 启动容器

bash

docker build -t my-nginx .
docker run -d -p 80:80 -p 443:443 --name nginx-container my-nginx

十、总结:Nginx 在现代架构中的角色

Nginx 凭借其高性能、灵活性和丰富的模块生态,成为 Web 服务器领域的标杆。从静态资源服务到复杂的微服务负载均衡,其核心优势贯穿整个技术栈。通过合理配置与优化,Nginx 可轻松支撑百万级并发流量,是企业级应用部署的首选方案。

最佳实践建议

  • 生产环境采用 “Nginx + 上游服务器” 架构,分离静态与动态请求。
  • 结合云服务商(如 AWS ALB、阿里云 SLB)实现弹性扩展。
  • 定期更新 Nginx 版本,及时修复安全漏洞(参考CVE 列表)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值