首先需要找到我们的配置文件(我的是 Mac 系统,通过 Homebrew 进行安装的 Nginx,可能和你的目录结构不一样):
配置文件大致结构:
main{ #全局配置
events{} #Nginx 服务器和用户的网络链接
http{ #服务器配置
upstream{} #负载均衡配置
server{ #主机设置
location{} #URL 匹配设置
}
}
}
main 全局配置
main 全局配置主要是配置 Nginx 在运行时候与具体业务功能无关的一些参数,例如工程进程数、运行身份等等。
user nobody; #指定 Nginx 进程使用哪个用户进行启动
worker_processes 4; #指定启动多少进程来处理请求
worker_cpu_affinity 0001 0010 0100 1000; #高并发的情况下,设置 CPU 和具体的进程棒的来降低多核 CPU 切换造成的寄存器重建到来的新能损耗
error_log logs/error.log; # error_log 是主模块的指令,用来定义全局错误日志。错误级别有 debug、info、notice、warn、error、crit 可以选择。
#error_log logs/error.log notice; #其中 debug 输出的日志最为详细,crit 的日志最少。
#error_log logs/error.log info;
pid logs/nginx.pid; #指定进程 pid 文件的位置
event 配置
events 模式主要是 Nginx 和用户交互网络连接优化的配置内容。
events{
use epoll; #指定 Nginx 的工作模式,可选有 select、poll、kqueue、epoll、rtsig 和 /dev/poll
worker_connections 65536; #每一个 woker 进程能处理的最大连接数
}
http 配置
该块是 Nginx 配置最频繁的模块,代理、缓存、日志等绝大多数功能都配置在这里。
http{
include mime.types; #表示配置文件所包含的文件的设置(支持的文件类型)
default_type application/octet-stream; #如果接收到的文件不存在与上面的文件类型中,那么就使用这个默认类型,表示二进制流
charset gb2312; #指定客户端的编码格式
sendfile on; #当 Nginx 作为静态服务器的时候,on 可以大大提高 Nginx 的性能
keepalive_timeout 60s; #指定 keepAlive 的超时时间,每个 TCP 连接最多保持多长时间,0 表示关闭
}
server 配置
该块和虚拟主机密切相关,虚拟主机从用户角度来看,和一台独立的硬件主机是完全一样的,该技术是为了节约互联网硬件的成本。每个 http 块可以包含多个 server 块,而每个 server 块就相当于一台虚拟主机。
location 块是基于 Nginx 接收到的请求字符串,对虚拟主机名称(或者 IP 地址)之外的字符串进行匹配,然后进行特定的处理。
server{
listen 80; #当前主机端口为 80
server_name localhost; #当前主机名称
location / { #当匹配到的路径为 / 的时候
root html; #根目录
index index.html index.htm; #指定首页文件
}
error_page 500 502 503 504 /50x.html; #指定错误码和错误页面
location = /50x.html { #匹配到 /50x 的时候
root html;
}
}
location 配置语法
基于 Nginx 接收到的请求字符串,对虚拟主机名称(或者 IP 地址)之外的 URI 字符串进行匹配,然后进行特定的处理,基本语法如下:
location [=|~|~*|^~] /uri/ {}
- = 表示必须完全匹配 URI
location = /api {}
- ^~ 表示匹配的 URI 只要前缀部分匹配即可
location ^~ /img/ {}
表示所有以 /img/ 开头的 URI
- ~ 表示匹配的时候 URI 的时候「区分」字母大小写,可以使用正则
- ~* 表示匹配 URI 的时候「不区分」字母大小写,可以使用正则
- URI 可以是一段正则
location ~ \.(png|jpg|jpge)$ {}
表示所有以图片格式结尾的 URI
- 单独一个 / 表示匹配所有的 URI,一般作为兜底匹配
location / {}
- @ 指定一个命名的 location,一般用于内部重定义请求
location @name {}
:::info 优先级:=
>^~
>~*
>/
,工作中应尽量把=
放在前面。 :::
文件路口的定义:
1、以 root 的方式设置资源的路径
root 可以写在 http、server、location 模块中进行配置。
location ^~ /backend {
root /data/www/backend
}
例如 URI 为 /backend/index/test.html 的时候就会返回 /data/www/backend/backend/index/test.html 这个文件。
2、以 alias 的方式设置资源路径
alias 也是用来设置文件资源路径的,它和 root 的不同点在于如何解读紧跟 location 后面的 URI 参数,可以在 location 中进行配置。
location ^~ /backend {
alias /data/www/backend
}
例如 URI 为 /backend/index/test.html 的时候就会返回 /data/www/backend/index/test.html 这个文件。 :::info alias 会把 location 后面的 URI 部分丢弃,而 root 不会。 :::
3、访问首页
可以在 http、serer、location 模块中进行设置。
index index.html index.htm index.php;
Nginx 会依次访问 index 中定义的文件名,直到访问成功为止。
4、根据 http 状态码重定向页面
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
5、try_files
可以配置在 server、location 模块中。
try_files path1 path2 ... uri;
try_files 后面会跟若干路径,Nginx 会尝试按照顺序访问每一个 path,如果可以有效的读取,就直接访问当下的 path 资源,否则继续向下访问,如果都读取不到那就重定向到 URI 参数上。
location /backend {
root /data/www;
try_files /a/b.html $uri/a/index.html $uri.html @other;
}
location other {
root /data/www;
index index.html;
}
以上案例中,当浏览器访问的是 127.x.x.x/backend 的时候,Nginx 就会匹配到 /backend 这个 URI 字符串,然后就会访问服务器中的 /data/www/backend 目录中:
- 先找 /data/www/a/b.html 这个文件
- 如果找不到就会找 /data/www/backend/a/index.html 这个文件
- 如果还是找不到就会找 /data/www/backend/index.html 这个文件
- 最后还是找不到就会跳转到 other 这个模块中进行查找