一、Nginx 概述

Nginx 是一款轻量级、高性能的 Web 服务器和反向代理服务器。它以事件驱动、异步非阻塞的架构设计,具备出色的并发处理能力,能够高效地处理大量的网络请求。在高并发场景下,Nginx 占用资源少、响应速度快,被广泛应用于静态资源服务、反向代理、负载均衡等场景,是构建现代 Web 应用架构的重要组件。

二、Nginx 配置详解

2.1 配置文件结构

Nginx 的配置文件主要由多个配置块组成,核心配置文件一般位于 /etc/nginx/nginx.conf 。整体结构包含全局块、events 块和 http 块,http 块内又可嵌套多个 server 块,server 块中还能包含 location 块 。

  • 全局块:配置影响 Nginx 全局运行的指令,如用户权限、工作进程数、错误日志路径等。例如 user nginx; 指定 Nginx 工作进程运行的用户;worker_processes 4; 设置工作进程数量,一般建议设置为 CPU 核心数,以充分利用系统资源。

  • events 块:主要配置 Nginx 的网络连接相关参数,如最大连接数、事件驱动模型等。worker_connections 1024; 表示每个工作进程的最大连接数,通过合理设置该参数,可以优化 Nginx 的并发处理能力。

  • http 块:是 Nginx 配置的核心部分,用于配置 HTTP 协议相关的参数,如 MIME 类型、日志格式、代理设置等。http 块内可以包含多个 server 块。

  • server 块:用于定义虚拟主机,每个 server 块对应一个独立的虚拟主机配置,包括监听端口、域名、SSL 证书配置、请求处理规则等。

  • location 块:用于匹配请求的 URL 路径,并根据不同的路径配置不同的处理规则,如指定静态资源路径、设置反向代理等。

2.2 常用配置指令

2.2.1 反向代理配置

通过反向代理,Nginx 可以将客户端请求转发到后端的多个服务器上,实现负载均衡和隐藏后端服务器细节的功能。在 server 块内的 location 中,使用 proxy_pass 指令配置反向代理地址。例如:

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_pass 指定后端服务器组名称;proxy_set_header 用于设置请求头信息,确保后端服务器能够获取客户端的真实 IP 等关键信息。

2.2.2 负载均衡配置

Nginx 支持多种负载均衡算法,如轮询(默认)、加权轮询、IP 哈希等。在 http 块中定义上游服务器组,然后在反向代理配置中使用。

http {
    upstream backend_servers {
        server 192.168.1.10:8080 weight=1;
        server 192.168.1.11:8080 weight=2;
        least_conn;
    }
    # 其他http配置...
}

上述配置中,定义了一个名为 backend_servers 的上游服务器组,包含两个后端服务器,并设置了不同的权重,使用 least_conn 算法将请求转发到连接数最少的服务器上。

2.2.3 静态资源服务配置

为提高静态资源的访问效率,Nginx 可以直接处理静态文件请求。在 location 中指定静态资源路径:

location /static/ {
    root /var/www/html;
    autoindex on;
}

root 指令指定静态资源的根目录;autoindex on 开启目录索引功能,方便浏览目录下的文件,但在生产环境中一般不建议开启,以避免信息泄露。

2.3 配置优化

  • 连接超时设置:合理设置 proxy_connect_timeout、proxy_read_timeout 和 proxy_send_timeout 等参数,避免因连接等待时间过长导致请求超时。

  • Gzip 压缩:启用 Gzip 压缩功能可以减小响应数据的大小,提高传输效率。在 http 块中添加如下配置:

http {
    gzip on;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}

gzip on 开启压缩;gzip_comp_level 设置压缩级别;gzip_types 指定对哪些类型的文件进行压缩。

三、Nginx k8s 容器化部署实践

3.1 准备工作

  • 安装 Kubernetes 集群:确保 Kubernetes 集群已正确安装并正常运行,可以使用 kubectl 命令行工具与集群进行交互。

  • 创建 Nginx 镜像:可以基于官方 Nginx 镜像进行定制,通过编写 Dockerfile 添加自定义配置文件和静态资源等。例如:

FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
COPY html /usr/share/nginx/html

然后使用 docker build 命令构建镜像,并将镜像推送到镜像仓库。

3.2 编写 Deployment 配置文件

使用 Deployment 来管理 Nginx 的多个副本,实现应用的弹性伸缩和滚动更新。创建 nginx-deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: your-nginx-image:tag
        ports:
        - containerPort: 80

replicas 指定 Nginx 的副本数量;image 指定使用的 Nginx 镜像;containerPort 指定容器暴露的端口。

3.3 暴露服务

通过 Service 将 Nginx 服务暴露出来,以便集群内部或外部访问。创建 nginx-service.yaml 文件:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

type: LoadBalancer 类型的 Service 会自动创建外部负载均衡器(在支持的云环境中),将请求转发到后端的 Nginx Pod 上。如果是本地测试环境,可以使用 NodePort 类型将服务暴露到节点的某个端口上。

3.4 部署与验证

使用 kubectl apply -f 命令依次部署 Deployment 和 Service:

kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml

通过 kubectl get pods 和 kubectl get services 命令查看 Pod 和 Service 的运行状态。访问 Service 的 IP 地址或域名,验证 Nginx 服务是否正常工作。

3.5 进阶操作

  • 配置更新:当需要更新 Nginx 配置时,可以通过修改 Deployment 中的镜像版本(如果镜像包含更新后的配置),或者使用 Kubernetes 的 ConfigMap 挂载配置文件,实现配置的动态更新。

  • 水平扩展:根据实际负载情况,使用 kubectl scale deployment nginx-deployment --replicas=5 命令动态调整 Nginx Pod 的数量,实现应用的水平扩展。

以上就是 Nginx 配置简略阐述以及在 k8s 容器化部署的实践内容。通过合理配置 Nginx 和在 k8s 中进行高效部署,能够充分发挥 Nginx 的性能优势,为 Web 应用提供稳定、高效的服务。