Nginx

Nginx(发音为"engine-x")是一个高性能的开源Web服务器和反向代理服务器。它具有占用资源少、并发处理能力强、扩展性好等特点,因此被广泛应用于构建高性能的网站、负载均衡、反向代理、缓存等场景。

正向代理

image-20230816152248020

反向代理

image-20230816152511849

负载均衡

轮询(Round Robin)

默认的负载均衡方法,按照请求的顺序依次将请求分发给后端服务器。每个请求按照轮询算法分配给不同的服务器。例如:

image-20230816152923805

加权轮询(Weighted Round Robin)

可以给不同的后端服务器设置权重,权重越大的服务器接收到的请求比例越高。通过调整权重,可以灵活地控制每个服务器的负载情况。

IP 哈希(IP Hash)

根据客户端的 IP 地址进行哈希运算,将同一个 IP 的请求始终分发到同一台后端服务器。这样可以保持会话的一致性,适用于需要保持状态的应用场景。

常用命令

  1. 启动 Nginx:nginxsystemctl start nginx(若使用 systemd)

    该命令用于启动 Nginx 服务器。

  2. 停止 Nginx:nginx -s stopsystemctl stop nginx

    该命令用于停止正在运行的 Nginx 服务器。

  3. 重新加载配置文件:nginx -s reloadsystemctl reload nginx

    该命令用于重新加载 Nginx 的配置文件,使更改生效,而无需停止服务器。

  4. 检查配置文件语法是否正确:nginx -tnginx -c /path/to/nginx.conf -t

    该命令用于检查 Nginx 配置文件的语法是否正确,如果有错误,将会给出相应的错误信息。

  5. 查看 Nginx 版本:nginx -vnginx -V

    该命令用于显示当前安装的 Nginx 版本号信息。

  6. 查看 Nginx 运行状态:nginx -s statussystemctl status nginx

    该命令用于查看 Nginx 服务器的运行状态,包括进程 ID(PID)、监听端口、内存占用等信息。

  7. 平滑重启 Nginx:nginx -s reloadsystemctl reload nginx

    该命令用于在不中断服务的情况下重新加载配置文件,并平滑地重启 Nginx 服务器。

  8. 停止所有 Nginx 进程:nginx -s quitsystemctl stop nginx

    该命令用于停止所有正在运行的 Nginx 进程,包括 master 进程和 worker 进程。

配置文件

Nginx 的配置文件主要由以下几个部分组成:

  1. 全局块(http 块外):全局块包含了全局的指令,对整个 Nginx 服务器生效。一般用于设置全局参数,例如 worker 进程数、用户和日志配置等。

    示例:

    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
  2. Events 块:Events 块用于配置 Nginx 的事件处理机制,如连接的最大数目和工作模式等。

    示例:

    events {
        worker_connections 1024;
    }
  3. Http 块:Http 块包含了 HTTP 相关的配置指令,定义了 HTTP 请求的处理方式、代理服务器、负载均衡等。

    示例:

    http {
        server {
            listen 80;
            server_name example.com;
            location / {
                root /var/www/html;
                index index.html;
            }
        }
    }
    • server 块:定义一个 HTTP 服务器,可以监听一个或多个端口,并配置其相关的虚拟主机信息。

    • listen 指令:定义服务器监听的端口号。

    • server_name 指令:定义服务器名称,用于匹配请求的域名。

    • location 块:用于匹配 URL,并定义相应的处理方式,如反向代理、静态文件处理等。

  4. Server 块:Server 块是在 Http 块内定义的,用于配置每个虚拟主机的相关设置。

    示例:

    server {
        listen 80;
        server_name example.com;
        location / {
            root /var/www/html; # 根路径
            index index.html; # index为参数,首先尝试返回index.html
        }
    }

    Server 块可以包含多个 Location 块,用于不同 URL 的请求处理。

配置负载均衡

要在 Nginx 中为代理设置负载均衡,你可以使用 upstream 指令来定义后端服务器的组,并在 proxy_pass 指令中引用该组。下面是一个负载均衡配置示例:

upstream backend_servers {
    server backend-server1;
    server backend-server2;
    server backend-server3;
}
​
location / {
    proxy_pass http://backend_servers;
}

在上述配置中,我们使用 upstream 指令定义了一个名为 backend_servers 的后端服务器组,其中包含了多个后端服务器的地址。

然后,在 location 块中,我们使用 proxy_pass 指令将请求转发到 http://backend_servers,这里的 backend_servers 实际上是之前定义的后端服务器组。

当有请求到达时,Nginx 将会根据负载均衡算法,选择其中一个后端服务器处理请求,实现负载均衡的效果。

在负载均衡配置中,你可以通过添加 weight 参数来为不同的后端服务器分配不同的权重,以调整负载均衡的比例。例如:

upstream backend_servers {
    server backend-server1 weight=3;
    server backend-server2 weight=2;
    server backend-server3 weight=1;
}

在上述配置中,backend-server1 的权重为3,backend-server2 的权重为2,backend-server3 的权重为1,这意味着 backend-server1 将接收更多的流量。