nginx笔记

443 阅读5分钟

一、Nginx 简介

Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。它以其高并发处理能力、低内存占用和强大的功能而受到广泛应用。

二、Nginx 安装

1. 准备工作

  • 操作系统要求:Nginx 可以在多种操作系统上运行,如 Linux、Unix 和 Windows 等。本教程以 Linux(以 CentOS 为例)为例进行讲解。
  • 安装依赖包:在 CentOS 上,需要安装一些依赖包,如gccpcre-develzlib-developenssl-devel。可以使用以下命令安装:
yum install -y gcc pcre-devel zlib-devel openssl-devel

2. 下载 Nginx

  • 从 Nginx 官方网站(nginx.org/)下载稳定版本的 Nginx 源代码。例如,使用wget命令下载:
wget http://nginx.org/download/nginx-<version>.tar.gz

其中<version>是要下载的版本号,如1.24.0

3. 编译和安装

  • 解压下载的源代码包:
tar -zxvf nginx-<version>.tar.gz
  • 进入解压后的目录:
cd nginx-<version>
  • 配置 Nginx:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

这里--prefix指定 Nginx 的安装目录,--with-http_ssl_module启用 SSL 模块(用于 HTTPS),--with-http_stub_status_module用于启用状态监控模块。

  • 编译和安装:
make
make install

4. 启动 Nginx

  • 安装完成后,可以在/usr/local/nginx/sbin目录下找到 Nginx 的可执行文件。使用以下命令启动 Nginx:
/usr/local/nginx/sbin/nginx
  • 可以通过访问服务器的 IP 地址(如果服务器有公网 IP)或localhost(在本地测试)来检查 Nginx 是否启动成功。默认情况下,Nginx 监听 80 端口。

三、Nginx 配置文件结构

  • Nginx 的主配置文件通常位于/usr/local/nginx/conf/nginx.conf
  • 配置文件分为几个部分:
    • main 块:主要设置一些影响 Nginx 全局的指令,如worker_processes(工作进程数)、error_log(错误日志路径)等。
    • events 块:用于处理网络连接相关的设置,如worker_connections(每个工作进程的最大连接数)。
    • http 块:用于配置 HTTP 相关的功能,包括服务器配置、虚拟主机、MIME 类型、日志格式、访问控制等。
    • server 块:定义虚拟主机,每个server块可以配置域名、端口、根目录、请求处理规则等。
    • location 块:用于对特定的 URI 进行请求处理规则的配置,可在server块内定义。

四、Nginx 优化

1. 优化工作进程数

  • 根据服务器的 CPU 核心数来合理设置worker_processes。一般情况下,可以设置为 CPU 核心数。例如,如果服务器有 4 个 CPU 核心,可以在main块中设置:
worker_processes 4;

2. 调整每个工作进程的连接数

  • 根据服务器的内存和预期的并发连接数,调整worker_connections的值。注意不要设置过高,以免耗尽服务器资源。例如:
events {
    worker_connections 1024;
}

3. 启用缓存

  • 可以在http块中设置缓存相关的指令。例如,设置缓存区域和缓存时间:
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;

    server {
        listen       80;
        server_name  example.com;

        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 60m;
            proxy_cache_valid 404 10m;

            proxy_pass http://backend_server;
        }
    }
}

这里定义了一个缓存区域my_cache,并在location块中对特定的请求启用缓存。

4. 文件描述符优化

  • 增加系统的文件描述符限制。可以通过修改/etc/security/limits.conf文件,添加以下内容(这里以设置为 65535 为例):
*       soft    nofile          65535
*       hard    nofile          65535

五、Nginx 反向代理

1. 基本配置

  • 假设后端有一个服务器运行在http://192.168.1.100:8080,要将example.com域名的请求反向代理到后端服务器,可以在nginx.confhttp块中配置如下:
server {
    listen       80;
    server_name  example.com;

    location / {
        proxy_pass http://192.168.1.100:8080;
        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指令用于设置传递给后端服务器的请求头信息。

2. 根据路径反向代理

  • 如果要根据不同的路径将请求代理到不同的后端服务器,可以使用多个location块。例如:

server {
    listen       80;
    server_name  example.com;

    location /api {
        proxy_pass http://api_server:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /web {
        proxy_pass http://web_server:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

六、Nginx 负载均衡

1. 轮询(Round - Robin)模式

  • http块中定义一个upstream块来配置后端服务器集群,然后在server块的proxy_pass中使用该upstream名称。例如:
http {
    upstream backend_pool {
        server 192.168.1.100:8080;
        server 192.168.1.101:8080;
    }

    server {
        listen       80;
        server_name  example.com;

        location / {
            proxy_pass http://backend_pool;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

这种方式下,Nginx 会按照顺序依次将请求分配到后端服务器上。

2. 加权轮询(Weighted Round - Robin)模式

  • 如果后端服务器的性能不同,可以为服务器设置权重。例如:
http {
    upstream backend_pool {
        server 192.168.1.100:8080 weight=2;
        server 192.168.1.101:8080 weight=1;
    }

    // 后续 server 块配置同轮询模式
}

这里服务器192.168.1.100:8080的权重为 2,会接收两倍于192.168.1.101:8080的请求。

3. IP 哈希(IP Hash)模式

  • 使用客户端的 IP 地址来确定将请求分配到哪个后端服务器。这样可以保证同一客户端的请求总是被转发到同一台后端服务器,适用于有状态的应用。例如:
http {
    upstream backend_pool {
        ip_hash;
        server 192.168.1.100:8080;
        server 192.168.1.101:8080;
    }

    // 后续 server 块配置同轮询模式
}

七、Nginx 集群

1. 基于 Keepalived 的高可用集群

  • 安装 Keepalived:在两台 Nginx 服务器(假设 IP 分别为192.168.1.10192.168.1.11)上安装 Keepalived。在 CentOS 上,可以使用yum install -y keepalived命令安装。
  • 配置 Keepalived
    • 192.168.1.10上的/etc/keepalived/keepalived.conf配置文件示例:
! Configuration File for keepalived

global_defs {
    notification_email {
        your_email@example.com
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL_10
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200
    }
    track_script {
        chk_nginx
    }
}

这里定义了一个vrrp_script来检查 Nginx 的运行状态,如果 Nginx 停止,降低 Keepalived 的优先级。vrrp_instance中设置了MASTER状态、虚拟路由器 ID、优先级等信息,并指定了虚拟 IP 地址192.168.1.200

  • 192.168.1.11上的keepalived.conf配置类似,但state设置为BACKUPpriority设置为 90。
  • 编写 Nginx 状态检查脚本(以 /etc/keepalived/check_nginx.sh为例)
#!/bin/bash

count=$(ps -C nginx --no-header | wc -l)
if [ $count -eq 0 ]; then
    systemctl start nginx
    sleep 2
    count=$(ps -C nginx --no-header | wc -l)
    if [ $count -eq 0 ]; then
        systemctl stop keepalived
    fi
fi

这个脚本检查 Nginx 是否在运行,如果停止则尝试启动,如果启动失败则停止 Keepalived,触发虚拟 IP 的切换。

2. 基于 DNS 轮询的集群

  • 在 DNS 服务器上配置域名解析,将域名解析到多个 Nginx 服务器的 IP 地址。例如,对于example.com域名,在 DNS 配置中添加两条 A 记录:
example.com. IN A 192.168.1.10
example.com. IN A 192.168.1.11

这样,客户端在访问example.com时,DNS 服务器会轮询地返回不同的 Nginx 服务器 IP 地址,实现简单的负载均衡和高可用性。不过这种方式可能存在一些问题,如 DNS 缓存可能导致负载不均衡,并且故障切换可能不够及时。