相关命令
在上一篇文章中我们已经安装好了 Nginx,并且也通过 /usr/local/nginx/sbin
下的 nginx
启动了它,而它的其它相关操作也是通过这个 nginx
可执行程序配合命令来完成的,如下:
- 启动 Nginx:
./nginx
; - 启动 Nginx 时指定主配置文件:
./nginx -c /path/to/config_file
; - 停止 Nginx:
./nginx -s stop
; - 查看 Nginx 版本号:
./nginx -v
; - 重新加载 Nginx 配置:
./nginx -s reload
;
配置文件
Nginx 的安装根目录为 /usr/local/nginx
,在该目录下 sbin
目录中有已经介绍了的可执行程序文件,而它的配置文件则是 conf/nginx.conf
,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。
该配置文件中有许多 #
开头的行,这些行是注释内容,我们去掉这些注释,精简之后的内容如下:
# nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
查看上述文件,很明显,我们可以将该配置文件内容分为三个部分,这里我把每个部分常用的指令都以注释的形式进行说明。
要注意的是,这里着重描述各个指令的作用,而下面有一些指令是可以在多个块中使用的,这一点我没有明确说明。
其实主要还是要明白各指令的作用,指令具体在可以那些块使用测一测也就知道啦~~当然,也可以参阅官网文档。
全局块
从配置文件到 events
块之间的内容,会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、运行生成的 worker process 数,进行 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
# 指定运行 worker 进程的用户和组,组可省略。
user nginx;
# 响应头隐藏 Nginx 的版本号。
server_tokens off;
# worker 进程的个数,通常应该略少于 CPU 物理核心数,这是 Nginx 服务器并发处理服务的关键配置,`worker_processes` 的值越大,可以支持的并发处理量就越多,但是会受到硬件、软件等设备的制约,可直接指定 auto 让 Nginx 根据机器环境自动调整。
worker_processes 2;
# 指定 Nginx 守护进程的 pid 文件。
pid /var/run/nginx/nginx.pid
# 是否以守护进程运行。
daemon on;
# 是否以 master/worker 模型来运行 Nginx,调试时可设定为 off。
master_process on;
# 用 CPU 掩码来绑定 worker 进程到固定的 CPU,避免 worker 进程切换频繁切换 CPU 造成资源消耗,绑定后也能延长 CPU 中的对应进程缓存有效性,提升了缓存的命中率。
# CPU 掩码是个的二进制数,从右至左第 n 位为 1 则说明绑定到第 n 个 cpu,所以如果要绑定三个 CPU,则是 0111,下例则是绑定 4 颗 CPU。
# 推荐直接指定 auto,Nginx 自动判断机器环境绑定,可使用 ps -eo pid,args,psr|grep [n]ginx 查看 worker 绑定到的 CPU。
worker_cpu_affinity 0101 1010;
# 指明 worker 进程的 NICE 值,配置 worker 进程在系统中的优先级,范围 `-20 ~ 20`,数字越小,优先级越高,默认为 0。
worker_priority 0;
# 所有 worker 进程一共最大可打开的文件数,默认使用的是操作系统的 `1024`,推荐修改为最大值 `65535`。
worker_rlimit_nofile 65535
# 设定计时器解析度,降低此值,可减少 gettimeofday() 系统调用的次数。
timer_resolution 100ms;
# 互斥锁锁文件路径。
lock_file logs/nginx.lock
# 指定错误日志路径,第二个参数为日志级别,日志级别有: debug, info, notice, warn, error, crit, alert, emerg。
error_log logs/error.log error;
events 块
events
块涉及的配置主要影响 Nginx 服务器与用户的网络连接。常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
events {
# 每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
worker_connections 1024;
# master 调用用户请求至各 worker 进程时使用负载均衡锁,on 表示能让多个 worker 轮流地、序列化地去响应新请求。
accept_mutex off;
# 指定 worker 在处理连接的情况下接收到新连接请求时到接受新连接的最长延迟时间。
accept_mutex_delay 500ms
# 指定使用的事件模型,建议让 Nginx 自行选择。
use [epool|rtsig|select|poll]
}
http 块
这算是 Nginx 服务器配置中修改最频繁的部分,代理、缓存和日志定义等绝大多数和第三方模块的配置都在这里,需要注意的是:http
块也可以包括 http 全局块、server 块。
http 全局块
http 主要定义协议级别的相关指令,包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
http { # 协议级别,由 ngx_http_core_module 支持
# 引用 MIME 文件。
include mime.types;
# 设定默认响应的 MIME Type。
default_type application/octet-stream;
# 定义日志格式,后续可以指定名称引用该格式,其中,各变量含义可参考 https://www.zze.xyz/archives/nginxvariables。。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';。
# 定义 json 日志格式。
log_format json_access '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
# 设定访问日志,日志格式引用上述名称 main 定义的格式。
access_log /var/log/nginx/access.log main;
# 使用 DMA 引擎减少文件拷贝次数,提高文件传输性能。
sendfile on;
# 将多个包整合在一起后一次性发送,需要开启 sendfile 才行。
tcp_nopush on | off;
# 提高网络传输实时性,需要开启 keepalive,来一个包发一个包,动态资源服务建议打开。
tcp_nodelay on | off;
# 指定监听的地址或端口,如 `listen 127.0.0.1:8000`、`listen *:8000`、`listen 8000`、`listen 127.0.0.1`、`listen localhost`;
listen 80;
# 指定长连接时长。
keepalive_timeout 120;
# 是否开启压缩。
gzip on;
# 指定 gzip 版本,默认 1.1。
gzip_http_version 1.0 | 1.1;
# 压缩的缓冲区
gzip_buffers 16 8k;
# 文件大于 1024 字节才进行压缩,默认值 20。
gzip_min_length 1024;
# 指定不压缩的文件。
gzip_proxied expired no-cache no-store private auth;
# 设置用于压缩响应的缓冲区的数量和大小。
gzip_buffers 32 4k|16 8k;
# 指定压缩文件的类型。
gzip_types text/plain application/xml;
# 指定压缩级别,1 ~ 9,数字越大压缩比越高。
gzip_comp_level 6;
server { # 虚拟主机级别
...
location / { # 请求级别
...
}
}
}
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的, 该技术的产生是为了节省互联网服务器硬件成本。
每个 http
块可以包括多个 server
块,而每个 server
块就相当于一个虚拟主机。而每个 server
块也分为全局 server
块,以及可以同时包含多个 locaton
块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
server { # 虚拟主机级别
# 指定监听的地址或端口,default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。
listen 80 [default_server];
# 指定监听的域名、主机名,域名可使用 * 作为通配符,也可使用正则表达式。
# 以访问 www.zze.xyz 为例,其匹配优先级从高到低如下:
# 1、完全匹配的域名,如 www.zze.xyz;
# 2、以 * 通配符开头的域名,如 *.zze.xyz;
# 3、以 * 通配符结尾的域名,如 www.zze.*;
# 4、第一个被正则表达式匹配到的域名 (按照配置文件中出现的顺序);
server_name localhost;
location / { # 请求级别
...
}
# 根据 http 响应状态码来指明特用的错误页面。
# error_page code... [=code] URI ,指定 =code 时,表示以指定状态码响应,默认以新资源的响应码为其响应码。
error_page 500 502 503 504 =200 /50x.html;
# 让 error_page 指令捕获反向代理返回的错误。
proxy_intercept_errors on;
location = /50x.html {
root html;
}
}
location 块
一个 server
块可以配置多 location
块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server.name/uri-string
)对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string
)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
location / { # 请求级别
# 指定请求资源的根目录。
root html;
# 指定多个尝试读取的文件路径,如果不存在则返回默认路径文件。
# 例:try_files $uri default.html
# 上例则是当请求的资源不存在时,默认返回 default.html。
try_files path1[,path2,...] default_path
# 添加响应头,下面示例是以添加跨域响应头为例
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
# 指定默认首页,可指定多个,从左至右依次匹配。
index index.html index.htm;
}
location
匹配语法支持如下几类:
location [ = | ~ | ~* | ^~ ]
=:表示不使用正则表达式匹配的 URL,要求请求字符串和的 URL 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求;
^~:表示不使用正则表达式匹配的 URL,要求 Nginx 服务器找到与请求 URL 匹配度最高的 location 后立即使用此 location 处理请求;
~:表示使用正则表达式匹配的 URL,区分大小写;
~*:表示使用正则表达式匹配的 URL,不区分大小写;
!~:表示使用正则表达式不匹配的 URL,区分大小写;
!~*:表示使用正则表达式不匹配的 URL,不区分大小写;
/string:表示不使用正则匹配以 string 开头的 URL,区分大小写,如果 string 不存在,则匹配任意 URL;
上述匹配优先级是从高到低排列。
评论区