在 Nginx 中,最主要的配置文件是 nginx.conf,这里我们就来简单地了解下该文件
首先,我们先来了解下配置中的主要模块
-
核心模块
-
配置影响 nginx 全局的指令
-
配置一般有:运行 nginx 的用户组、nginx 进程 pid 的存放路径、日志存放路径、配置文件引入、允许生成工作进程数等
-
-
events 模块
-
配置影响 nginx 与用户的网络连接
-
配置一般有:每个进程的最大连接数、选取哪种事件驱动模型来处理连接请求、是否允许同时接受多个网络连接、开启多个网络连接序列化等
-
是核心模块的子模块
-
-
http 模块:
-
可以嵌套多个 server 块,配置代理、缓存、日志定义等绝大多数功能和第三方的模块配置
-
例如:文件引入、mime-type 定义、日志自定义、是否使用 sendfile 传输文件、连接超时事件、单连接请求数等
-
-
server 模块:
-
配置虚拟主机的相关参数,一个 http 块中可以嵌套多个 server 块
-
是 http 模板的子模块
-
-
location 模块:
-
配置请求的路由以及各种页面的处理情况
-
是 http 模板的子模块
-
-
upstream 模块
- 配置负载均衡
接着,我们再来整体地解析下该配置文件
一、核心模块
user nobody nobody;
-
user:
- 设置 nginx 的用户和组,默认为 nobody nobody,如果 group 省略则 group 默认为与 user 同名的组
// 4个cpu,开启4个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
-
worker_processes
- 设置 nginx 进程数,默认为 1
-
worker_cpu_affinity
- 设置开启多核 cpu,让不同的进程使用不同的 cpu
-
关于 worker_processes 和 worker_cpu_affinity 的具体用法可以看这里
error_log logs/error.log;
-
error_log
- 设置错误日志的存放路径
pid logs/nginx.pid;
-
pid
- 设置进程 pid 的存放路径
二、events模块
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 1024;
}
-
accept_mutex
-
设置网络连接序列化,防止发生惊群现象,默认为 on
-
惊群:指的是多线程/多进程同时阻塞等待同一个事件,当这个事件发生时,这些线程/进程就会同时被唤醒去响应这个事件,然而只有一个线程/进程能处理该事件,其他进程/线程在处理失败后重新进入休眠状态,在一定程度上降低了系统性能
-
关于惊群现象,具体的可以看这里
-
-
multi_accept
- 设置一个进程是否同时接受多个网络连接,默认为 off
-
use
- 设置事件驱动模型,默认为 epoll (select | poll | kqueue | epoll | resig | /dev/poll | eventport)
-
worker_connections
- 设置最大连接数,默认为 512
三、http模块
http {
sendfile off;
sendfile_max_chunk 100k;
keepalive_timeout 65;
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 logs/access.log main;
sendfile on;
sendfile_max_chunk on;
keepalive_timeout 65;
}
-
sendfile
- 设置是否允许使用 sendfile 方式来传输文件,默认为 off
-
sendfile_max_chunk
- 每个进程每次以 sendfile 方式来传输文件时,传输的数据量不能大于设定的值,默认为 0,即不设上限
-
keepalive_timeout
- 设置链接超时时间,默认为 75s
-
include
- 文件扩展名与文件类型映射表
-
default_type
- 设置默认文件类型,默认为 text/plain
-
log_format
-
设置访问日志的格式,其常用配置项如下
-
$remote_addr
- 记录访问程序的客户端地址
-
$remote_user
- 记录客户端用户名
-
$time_local
- 记录访问的时间与时区
-
$request
- 记录请求的 url 和 http 协议
-
$status
- 记录请求返回的状态码,如:200、404、500等
-
$body_bytes_sent
- 记录服务端发送给客户端的主体内容大小
-
$http_referer
- 记录此次请求是从哪个页面链接访问过来的
-
$http_user_agent
- 记录客户端的相关信息,如:操作系统、浏览器等
-
$http_x_forwarded_for
- 当客户端通过代理服务器访问程序时,记录客户端地址及代理端地址 (即代理信息)
-
-
-
access_log
-
设置访问日志的存放路径,默认为 logs/access.log main
-
nginx 会将用户访问服务器的日志信息存储到访问日志中吗,供我们来分析用户的浏览行为
-
此功能由 ngx_http_log_module 模块负责
-
四、server 模块、location 模块
server {
listen 80;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://tomcatcluster.com;
proxy_redirect default;
}
}
-
listen
- 设置监听的端口
-
server_name
- 设置监听的地址
-
root
- 设置请求的根目录
-
index
- 设置请求的默认页面
-
proxy_pass
- 设置请求跳转的地址 (代理地址),可与 upstream 模块中定义的服务器集群名字搭配使用,用于搭建负载均衡集群
-
proxy_redirect
- 设置 HTTP 头部的 location 或 refresh 字段,默认为 default
五、upstream 模块
upstream tomcatcluster.com {
server 127.0.0.1:8001 weight=1;
server 127.0.0.1:8004 weight=2;
}
-
tomcatcluster.com
- 服务器集群名字 (自定义),可与 server 模块中的 proxy_pass 属性搭配使用,用于搭建负载均衡集群
-
server
- 设置代理服务器地址
-
weight
- 设置权重大小,权重越大,分配的概率越大