配置文件结构

Nginx的配置文件nginx.conf包含三个内容:

  • 全局块
  • events块
  • http块

Nginx 的配置文件(通常为 /etc/nginx/nginx.conf)采用分块结构,主要包括以下三大类:

├── 全局块(main block)
├── events 块
└── http 块
     ├── server 块
     │    └── location 块

全局块 Main Block

从配置文件开始到events块之间的内容,此处的配置影响Nginx服务器整体的运行,比如Works进程的数量、错误日志的位置等。

  • 位置: 配置文件顶部
  • 作用: 配置影响整个 Nginx 服务的全局参数

配置示例

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;

主要参数说明:

  • user:设置 Nginx 进程运行用户
  • worker_processes:工作进程数量,建议设为 CPU 核心数
  • error_log:指定错误日志路径和日志级别
  • pid:指定进程 ID 文件的位置

Events块

events主要影响Nginx服务器与用户的网络连接,比如 worker_connections 1024,标识每个process支持最大连接数是 1024

  • 位置: 紧接在全局块之后
  • 作用: 控制 Nginx 的连接处理模型,与高并发性能密切相关

配置示例

events {
    worker_connections 10240;
    use epoll;
}

主要参数说明:

  • worker_connections:每个 worker 进程支持的最大连接数
  • use epoll:指定事件驱动模型(Linux 通常用 epoll)

HTTP块

http块配置是变动最频繁的,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡等。

  • 位置: 最核心模块
  • 作用: 处理所有基于 HTTP 协议的请求,包含服务器配置、反向代理、负载均衡等

配置示例

http {
    include       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;
    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
}

主要包含:

  • server 块:定义虚拟主机(监听端口、域名)
  • location 块:定义 URI 匹配规则和处理方式
  • upstream 块:定义上游服务器组(负载均衡)
  • log_format/access_log:定义日志格式

反向代理

需求一

部署tomcat,保持默认监听8080端口。修改Nginx配置,并重新加载。

需求二

部署一台tomcat,保持监听8081端口。修改Nginx配置,重新加载。

该部分主要就是多Location的使用,语法如下:

location [=|~|~*|^~] /uri/ { … }

在Nginx配置文件中,location有如下几种形式:

  • 1 正则匹配 location ~ /xxx {}
  • 2 不区分大小写的正则匹配 location ~* /xxx {}
  • 3 匹配路径的前缀 location ^~ /xxx {}
  • 4 精确匹配 location = /xxx {}
  • 5 普通路径前缀匹配 location /xxx {}

优先级:4 > 3 > 2 > 1 > 5


负载均衡

轮询

默认策略,每个请求按时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除。

upstream wzk {
 server localhost:8080;
 server localhost:8082;
}

location /abc {
 proxy_pass http://wzk/;
}

weight

weight代表权重,默认每一个负载的服务器都为1,权重越高被分配的请求越多(用于服务器性能不均衡的场景)

upstream wzk {
 server localhost:8080 weight=1;
 server localhost:8082 weight=2;
}

ip_hash

每个请求按照ip的hash结果分配,每一个客户端的请求会固定分配到同一个目标服务器处理,可以解决Session问题

upstream wzk {
 ip_hash;
 server localhost:8080 weight=1;
 server localhost:8082 weight=2;
}

动静分离

动静分离就是将动态资源和静态资源的请求处理分配到不同的服务器上,比较经典的组合就是Nginx+Tomcat(Nginx处理静态资源,Tomcat处理动态资源),之前的例子中,Nginx反向代理目标服务器Tomcat,我们看到目标服务器ROOT的项目 index.jsp,这本身就是Tomcat在处理动态资源了。