首先需要找到我们的配置文件(我的是 Mac 系统,通过 Homebrew 进行安装的 Nginx,可能和你的目录结构不一样):
image.png

配置文件大致结构:

  1. main{ #全局配置
  2. events{} #Nginx 服务器和用户的网络链接
  3. http{ #服务器配置
  4. upstream{} #负载均衡配置
  5. server{ #主机设置
  6. location{} #URL 匹配设置
  7. }
  8. }
  9. }

image.png

main 全局配置

main 全局配置主要是配置 Nginx 在运行时候与具体业务功能无关的一些参数,例如工程进程数、运行身份等等。

  1. user nobody; #指定 Nginx 进程使用哪个用户进行启动
  2. worker_processes 4; #指定启动多少进程来处理请求
  3. worker_cpu_affinity 0001 0010 0100 1000; #高并发的情况下,设置 CPU 和具体的进程棒的来降低多核 CPU 切换造成的寄存器重建到来的新能损耗
  4. error_log logs/error.log; # error_log 是主模块的指令,用来定义全局错误日志。错误级别有 debug、info、notice、warn、error、crit 可以选择。
  5. #error_log logs/error.log notice; #其中 debug 输出的日志最为详细,crit 的日志最少。
  6. #error_log logs/error.log info;
  7. pid logs/nginx.pid; #指定进程 pid 文件的位置

event 配置

events 模式主要是 Nginx 和用户交互网络连接优化的配置内容。

  1. events{
  2. use epoll; #指定 Nginx 的工作模式,可选有 select、poll、kqueue、epoll、rtsig 和 /dev/poll
  3. worker_connections 65536; #每一个 woker 进程能处理的最大连接数
  4. }

http 配置

该块是 Nginx 配置最频繁的模块,代理、缓存、日志等绝大多数功能都配置在这里。

  1. http{
  2. include mime.types; #表示配置文件所包含的文件的设置(支持的文件类型)
  3. default_type application/octet-stream; #如果接收到的文件不存在与上面的文件类型中,那么就使用这个默认类型,表示二进制流
  4. charset gb2312; #指定客户端的编码格式
  5. sendfile on; #当 Nginx 作为静态服务器的时候,on 可以大大提高 Nginx 的性能
  6. keepalive_timeout 60s; #指定 keepAlive 的超时时间,每个 TCP 连接最多保持多长时间,0 表示关闭
  7. }

server 配置

该块和虚拟主机密切相关,虚拟主机从用户角度来看,和一台独立的硬件主机是完全一样的,该技术是为了节约互联网硬件的成本。每个 http 块可以包含多个 server 块,而每个 server 块就相当于一台虚拟主机。
location 块是基于 Nginx 接收到的请求字符串,对虚拟主机名称(或者 IP 地址)之外的字符串进行匹配,然后进行特定的处理。

  1. server{
  2. listen 80; #当前主机端口为 80
  3. server_name localhost; #当前主机名称
  4. location / { #当匹配到的路径为 / 的时候
  5. root html; #根目录
  6. index index.html index.htm; #指定首页文件
  7. }
  8. error_page 500 502 503 504 /50x.html; #指定错误码和错误页面
  9. location = /50x.html { #匹配到 /50x 的时候
  10. root html;
  11. }
  12. }

location 配置语法

基于 Nginx 接收到的请求字符串,对虚拟主机名称(或者 IP 地址)之外的 URI 字符串进行匹配,然后进行特定的处理,基本语法如下:

  1. 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 模块中进行配置。

  1. location ^~ /backend {
  2. root /data/www/backend
  3. }

例如 URI 为 /backend/index/test.html 的时候就会返回 /data/www/backend/backend/index/test.html 这个文件。

2、以 alias 的方式设置资源路径
alias 也是用来设置文件资源路径的,它和 root 的不同点在于如何解读紧跟 location 后面的 URI 参数,可以在 location 中进行配置。

  1. location ^~ /backend {
  2. alias /data/www/backend
  3. }

例如 URI 为 /backend/index/test.html 的时候就会返回 /data/www/backend/index/test.html 这个文件。 :::info alias 会把 location 后面的 URI 部分丢弃,而 root 不会。 :::

3、访问首页
可以在 http、serer、location 模块中进行设置。

  1. index index.html index.htm index.php;

Nginx 会依次访问 index 中定义的文件名,直到访问成功为止。

4、根据 http 状态码重定向页面

  1. error_page 404 /404.html;
  2. error_page 502 503 504 /50x.html;

5、try_files
可以配置在 server、location 模块中。

  1. try_files path1 path2 ... uri;

try_files 后面会跟若干路径,Nginx 会尝试按照顺序访问每一个 path,如果可以有效的读取,就直接访问当下的 path 资源,否则继续向下访问,如果都读取不到那就重定向到 URI 参数上。

  1. location /backend {
  2. root /data/www;
  3. try_files /a/b.html $uri/a/index.html $uri.html @other;
  4. }
  5. location other {
  6. root /data/www;
  7. index index.html;
  8. }

以上案例中,当浏览器访问的是 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 这个模块中进行查找