nginx简单配置及部分常用指令说明

115 阅读3分钟

一、前言

之前进行前端项目部署的时候,刚开始对 nginx 部署项目的一些常见指令不熟悉,也踩了不少坑,现在找时间又进行了回顾和整理,然后记录一个简单的配置,对一些指令加以说明,方便自己查阅,也做一些分享。
附:nginx documentation

二、nginx简单配置示例

server {
    listen 6004 default_server;
    listen [::]:6004 default_server; #  用于IPv6地址
    server_name  localhost; 
    
    location /{
        root   /var/html/app/;
        index  index.html index.htm;
    }
    
    try_files  $uri $uri/ /index.html;
    
    location  /api/ {
        proxy_pass http://46.82.102.7:8000;  #  反向代理
    }
    
    gzip on;  #  gzip压缩
    gzip_min_length 1k;
    gzip_comp_level 4;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_disable "MSIE [1-6]\.";   #  配置禁用gzip条件,支持正则,IE6以下的浏览器不支持
    gzip_vary on;  #  是否添加“Vary: Accept-Encoding”响应头
}

三、部分常用指令及其值的说明

下面的指令及其值主要针对上面例子中存在过的进行说明。
server
用来配置虚拟服务器,nginx 配置文件必须至少包含一个服务器指令来定义虚拟服务器。 当 nginx 处理请求时, 它会选择提供请求的虚拟服务器,它们都包含在 http 模块里,一个 http 模块中可以有多个 server 模块。

listen
nginx 服务通过 listen 指令监听网络请求,它可以是 IP 协议的形式,也可以是 UNIX 域套接字。如果不设置 listen 指令,nginx 在以超级用户运行时监听 80 端口,否则监听 8000 端口。示例如下:

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
#监听IPv6地址
listen [::]:8000;
listen [::1];

default_server
nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求 ,如果没有显式定义,则会选取第一个定义的 server 作为 default_server, default_server 可以有多个,但配置的端口需要不同。

server_name
server_name 用来表明主机名称。如果有多个服务器与请求的 IP 地址和端口相匹配,nginx 将根据服务器块中的 server_name 指令测试请求的主机头域,server_name 后面的主机名称可以有多个。

location
location 指令根据 uri 来决定如何处理用户请求(是转发请求或者查找本地文件进行处理)。它会根据一定的规则将 uri 和 location 后面的参数进行匹配,支持正则表达式,匹配规则此处不做详述。

root
设定请求 uri 的本地文件根目录。

index
在前后端分离的基础上,通过 nginx 配置,指定网站初始页。index 后如果跟有多个文件,nginx 会根据文件的出现顺序来检查,直到查找的文件存在,文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后,文件可以使用变量$来命名。#index相关详情参考

uri
它指当前的请求 uri,不包括任何参数。它反映任何内部重定向或 index 模块所做的修改。注:它和 $request_uri 不同,$request_uri 是浏览器发起的不做任何修改的原生 uri ,它们都不包括协议及主机。
例:https://127.0.0.1/image.png?test=1
$uri 为 /image.png
$request_uri 为 /image.png?test=1

try_files
官网上的语法如下:
Syntax: try_files file ... uri; 或 try_files file ... =code;
Default: —
Context: server, location
它会根据 root 或者 alias 指令提供的值(路径),按照 try_files 指令值的顺序查找 file 是否存在;如果可以找到,以找到的第一个 file 进行请求处理;如果 try_files 指令提供的 file 都没匹配到,那么就会内部重定向到最后一个参数给定的 uri。
例:try_files $uri $uri/ /index.html;
比如请求https://127.0.0.1/image.png?test=1 会依次查找文件 /var/html/app/image.png,然后是文件夹 /var/html/app/image.png/ 下的 index 文件,找不到的话最后会请求 127.0.0.1/index.html。

proxy_pass
反向代理,常用于解决跨域问题或者配置负载均衡。proxy_pass 指令后面跟的 url 要注意格式,尤其是末尾加不加斜杠/(我之前在部署项目时也曾因/产生bug)。通常 nginx 配置 proxy_pass 指令时,如果 proxy_pass 后面的 url 加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分代理上。(想了解 url 写法详情可参考# proxy_pass url 反向代理的坑

gzip
用于压缩,提高传输速度。
gzip on|off 打开或关闭 gzip 压缩;
gzip_min_length 开启压缩的最小阈值,一般太小就没必要进行压缩,可能压缩后反而更大; gzip_comp_level 压缩级别(1-9),数字越大,压缩级别越高,体积越小,同时也更消耗 cpu 资源;
gzip_types 设置需要压缩的 MIME 类型,如果不在设置类型范围内的请求不进行压缩;
gzip_disable 禁用 gzip 压缩配置,支持正则(ie6 及以下不支持 gzip 压缩);
gzip_vary 是否在 http header 中添加 Vary: Accept-Encoding,建议开启;