一、前言
之前进行前端项目部署的时候,刚开始对 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,建议开启;