最近越来越频频地遇到需求装备反向署理的场景,在自己树立博客的时分,也不行避免要用到 Nginx,所以这段时刻集中学习了一下 Nginx,同时做了一些笔记,期望也能够协助到咱们~

这篇文章会在 CentOS 环境下装置和运用 Nginx,假如对 CentOS 根本操作还不太清楚的,能够先看看 <半小时搞会{ d Z ~ e CentOS 入门必备基础知识> 一文先做了解。

信任作为开发者,咱们都知道 Nginx 的重要,废话不多说,一起来学习吧。

CentOS 版别: 7.6

Nginx 版别: 1.16.1

1. Nginx 介绍

传统的 Web 服务器,每个客户端衔接作为一个单独的进程y q ) m f 9 c g 或线程处理,需在切换任务时将 CPU 切换到K , ! E H 3 J F A新的任务并创立一个新的运转时上下文,消耗额定的内存和 CPU 时刻,当并发恳求添加时,服务器呼应变慢M Z ; # h g } k T,从而对功用发生负面影响。

Nginx 从入门到实践,万字详解!

Nginx 是开源、高功用、高可靠的 Web 和反向/ I署理服务器,而且支撑热布置,简直能够做到 7 * 24 小时不间断运转,即便运转几个月也P ( F u _ E E : B不需求从头发动,x ) h Y c ` ; u 9还能在不间断服务的情况下对软件版别进行热B Y &更新。功用是 Nginx 最重要的考量,其占用内存少、并C c O B l发能力强、能支撑高达 5w 个并发衔接数,最重要的是,Nginx 是. 5 c o J 7免费的并能够_ B k商业f 5 u O R化,装备运用也比较简略。

Nginx 的最重要2 ? & Z的几个运用场景:

  1. 静态资源服务,经过本地文件体系供给服务;
  2. 反向署理服务,延伸出包括缓存、负载均衡等;
  3. API 服务,OpenResty ;

关于前端来说 Node.js 不陌生了,Nginx 和 Node.js 的许多理念相似,HTTP 服务器、事情驱动、异步非m 6 }堵塞等,且 Nginx 的大部分功用运用 Node.js 也能够完结,但 Nginx 和 Node.js 并不冲突,都有自己拿手的范畴。Nginx 拿手于底层服务器端资源的处理(静态资源处理转发、反向署理,负载均衡等),N* 8 S $ , ( & C pode.js 更拿} s y x 1 * g e +手上层详细事务e W $ 2 @ . i ;逻辑的处理,两者能够完美组合,一起助力前端开发。

下面咱们着重学习一下 N+ a T @ – s _ginx 的运用。

2. 相关概念

2.1 简略恳求和非简略恳求

首要咱们来了解一下简略恳求和非简略恳求,假如同时满足下面两个条件,就属于简略恳求:

  1. 恳求办法是 HEADGETPOST 三种之一;! a , ? t n
  2. HTTP 头信息不超越右边着几个字段:AcceptAccept-LanguageContent-LanguageLast-EvN J y x 0 , `ent-ID
    Contentr O $ a-Type 只限于三个值 appli! p f t ~ }cation/x-www-form-urlencodedmultipart/form-datatext/plain

凡是不同时满足这两个条件的,都属于非简略恳求。

浏览器处理简略恳求和G # g v 6 A非简略恳求的方法不相同:

简略恳求

关于简略恳求,浏览器会在头信息中添加 Origin 字段后直接S Q B % C ` P宣布,Origin 字段用来阐明,本次恳求来自的哪k } p 1 F v b a w个源(协议+域名+端口)。

假如服务器发现 Origin 指定的源不在答应范围内,服务器会回来一个正常的 HTTP 回应,浏览器取到回应之后发现回应的头信息中没有包括 Access-Control-Allow-Origin 字段,就抛出一个过错给 XH} a a y # 9 k / R 的 error 事情;

假如服务器发) D J J d W v v 1Origin 指定的域名在答应范围内,e } P , T W 1 ( B服务器回来的呼应会多出几个 Access-Control- 最初的头信息字段。

非简略恳求

非简略恳求/ + 9 z Y 5 V是那种对服务器有特殊要求的恳求,比方恳求办法是 PUTDELETE,或 Cg # f L t {ontent-Type[ a : C ) ] p | 值为 applN 4 g , : z eication/json。浏览? N K E ,器会在正式通讯之前,发送一次 HTTP 预检 OPTIOb m sNS 恳求,先询问服务器,当时网页所在的域名是否在服务器的答} ~ 9 u U [ h应名单之中,以及能够运用哪些 HTTP 恳求办法和头信息字段。只要得到必定| N b答复,浏览器才会宣布正式的 XHR 恳求,不然报错。

2.2 跨域

在浏览器上当时拜访的网站向另一个网站发送恳求获取数据的进程便是跨域恳求

跨域是浏览器的同源战略决定的,是一个w % ,重要的浏览器安全战略,用于约束一个 origink ~ q 0 – u 的文档或许它加载的脚本与另一个源的资源进行交互,它能够协助隔绝恶意文档,削减或许被进犯的媒介,能够运用 CORS 装备免除这个约束。

关于跨域网上现已有许多解释a q y 4 ( 6,这儿就不烦f 6 p B琐,也能够直接看 MDN 的 <浏览器的同源战略> 文档进一步了解,这儿3 g U C 4 $ D V T就列举几个同源和i | , 5不同元的比方,信任程序员都能看得懂。

# 同源的比方
http://example.com/app1/index.html  # 仅仅途径不同
httpj 4 ^ r x://example.com/app2/in{ 8 4 ] D V J ; |dex.htG  3 M 0 + 7ml
http://Example.coZ . / h X F J wm:80  # 仅仅巨? - n细写差异
http:v F X p 9 S//examp} M 9le.com
# 不同源的y 9 + G f比方
http://example.com/app1   # 协议不同
https://example.com/app2
ho - V p x W ; z kttp://example.com        # host 不同
http://www.example.com
http://mB ; ! E 7 h Tyapp.example.com
http://example.com        # 端口不同
hK F Q r Pttp://example.com:8080

2.3 正向署理和反向署理

反向署理(Reverse Proxy)对应的是正向署理(Forward Proxy),他们的差异:

正向署理: 一般的拜访流程是客户端直接向方针服务器发送恳求并获取内容,运用正向署理后,客户端改为向署理服务器发送恳求,并指定方针服务器+ { f ~(原始服务器),然后由署理服务器和原始服务器通讯,转交恳求并取得的内容,再回来给客户端。正向署理躲藏了实在的客户端,为客户端收发恳求,使实在客户端对服务器不行见;

举个详细的比方 ,C H b & 5 N你的t j 6 N 4 & r B浏览器无; M . % B 2 G a法直接拜访谷哥,这时分能@ j W g 6 . O Y够经过一个署理服务器来协7 Y X @ K助你拜访谷哥,那么这个服务器就叫正向署理。

反向署理: 与一般拜访流程相比,运用反向署理后,直接收到恳求的服务器是署理服务器,然后将恳求转发给内o 1 U部网络上真正进行处理的服务器,得I $ d 到的成果回来给客户端。反向署理躲藏了实在的服务器,为服务器收发恳求,使实在服务器对客户端不行见。一般在处理跨域恳求的时( 5 9分比较常用。现在根本上一切的大型网d h : l , (站都设置了反向署理。

举个详细的比方 ,去A k E m饭馆吃饭,能够点川菜、粤菜、江浙菜,饭馆也别离有三个菜系的厨师 ‍,可是你作为顾客不必管哪个厨师给w % 8 A你做的菜,只用点菜即可,小二将你菜单中的菜分配给不同的厨师来详细处理,那么这个小二便是反向署理服务器。

简略的说,一般给客户端做署理的都是正w 1 ; y # #向署理,给服务器做署理的便是反向署理。

正向署理和反向署理首要的原理差异能够拜见下图:c I Y M % p 5

Nginx 从入门到实践,万字详解!

2.4 负载均衡

一般情况下,客户端发送多个恳求到服务器,服务器处理恳求,其间一部分或许要操作一些资源比方数据库5 H 0 r、静态资源等,服务器处理结束后,再将成果回来给客户端。

这种形式+ Q B ^ f u 1 ; *关于前期的体系来说,功用y J E [ 7要求不杂乱,且并发恳求相对较少的情况下还能胜任,成+ W &本也低。跟着信息数量不断添加,拜访量和数据量飞速添加,以及体系事务杂乱度继续添加,这种做法已无法满足要求,并发量特别大` p u { Q j v时,服务器简略崩。

很明显这是因为服务器功用的瓶颈造成的问题,除了堆机器之外,最重要的做法便是负载均衡。

恳求爆发式添h C X C ` y N r X加的情况下,单个机器功用再微弱也无法满足要求了,这个时分集群的概念发生了,单个服务W 2 ! a E .器处理不了的问题,能够运用多个服务器,然后将恳求分发到各个服务器上,将负载分– ) r J n发到不同的服务器,这便是负载均衡,中心是「分摊压力」。Nginx 完结负载均衡,一般来说指的是将恳求转发给服务器集群。

举个详细的比方 ,晚q y p . y 7 !高峰乘坐地铁的时分,入站口常常会有地铁作业人员大P 2 0 B喇叭“请走 B 口,B 口人少车空….”,这$ N 0 + { /个作业人员的作用便是负载均衡。

Nginx 从入门到实践,万字详解!

2.5 动态别离

为了加快网站的解析速度,能够把动态页面和静态页面由不同的服务器来解析,w ; G 5 Y v `加快解析速度,降低原来单个服务器的D % x n压力。

Nginx 从入门到实践,万字详解!

一般来说,都需求Y Y L .将动态资源和i { V Z 4 P { & k静态资源分隔,因为 Nginx 的高并发和静态资源缓存等特性,常常将静态资源布置在 Nginx 上。假如恳求的是静态资源,直n 4 N 1接到L – v D . g p ` h静态资源s I u J H D目录获取资源,假如是动态资源c j g D )的恳x Q t f 9求,则利用反向署理的原理,把恳求转发给对应后台应用去处理,从而完结动态别离。

运用前后端别离后,能够很大程 ! y d I度提高静态资源的拜访速度B A I d n `,即便动态服务不行用,静态资源的拜访也不会受到影响。

3. Nginx 快速装置

3.1 装置

咱们能够先看看

yum list | grep nginx

来看看

Nginx 从入门到实践,万字详解!

然后

yum inK 2 J y H # `stall nginx

来装置 Nginx,然后咱们在指令行中 nginx -v 就能够看$ 7 R 到详细的 Nginx 版别信息,也就装置结束了。

Nginx 从入门到实践,万字详解!

3.2J F W ^ W z K * 相关文件夹

然后咱们能够运用 rpm -ql nginx 来检查 Nginx 被装置到了什么地方,有哪些相关目录,其间坐落 /etc 目录下的首要是装备文件,还有一些文件见下图:

Nginx 从入门到实践,万字详解!

首要重视的文件夹有两个:

  1. /etc/nginx/conf.d/ 文件夹,是咱们进行子装备的装备项寄存处,/etc/nginx/nginx.conf 主装备文件会默许把这个文件夹中d Z q } H一切子装备项都引进;
  2. /us* u ( 9 4 5r/share/nginx/htmld 6 P Y b 4 y/ 文件夹,一般静态文件都放在这个文件夹,也能够依据你自己的习气放其他地方;6 ` W x

3.3 跑起来康康

装置之后敞开 Nginx,假如体系敞开了防火墙,那么需求设置一下在防火墙中参加需求敞开的端口,下面列举几个常用的防火墙操作(没敞开的话不必管这个} W ( T ^ E D 4):

systemctlH / | d K F start firewalld  # 敞开防火墙
systemctl stop firewalld   # 封~ @ ~ @ ` X闭防火墙
systemctl status firewalld # 检查防火墙敞开状况,显示running则是正在运转
firewall-cmd --reloadE , I f I @ e 3      # 重启防火墙,永久翻开3 G 5 - C ? j k G端口需求rel^ U 9 ) L m E Z 1oad一下
# 添加敞开端口,--permanent表明永久翻开,不加是临时翻开重启之S % _ & ? n (后失效
firewall-cmd } / Wd --permanent --zone=public --add-port=8888/tcp
# 检查防火墙,添加的端口也能够看到
firewall-cmd --list-all

然后设置 Nginx 的开机发动:

systemctl enable nginx

发动 Nginx (其他指令后边有详细解说):

systemctl start nginx

然后拜访你的R s ` IP,这时分就能够看到 Nginx 的欢迎页面了~ Welcome to nginx!

3.4 装置 nvm & nR z j R X J D X Iode & git

# 下载 nvm,或许看官网的进程 https://github.com/nvm-sh/nvm#install--updatD [ W 0 L H fe-scriptX h N j
curlo z d @ -o- https://raw.githubusercq 2 D h nontent.com/nvm-sh/nv , W v T h 5 0 7vm/v0.35.3/install.sh | bash
source   ~/.bashrc    # 装置结束后,更新装备文件即可运用 nvm 指令
nvm ls-remote         # 检查远程 node 版别
nvm install v12.16.3  # 选一个你要装置的版别装置,我这儿选择 12.16.3
nvm list              # 装置结束检查装置的 node 版别
node -v               # 检查是否装置好了
yum install git   # git 装置

4. Nginx 操作常用指令

Nginx 的指令在控制台中输入 nginx -h 就能够看到完整的指令,, O # $这儿列举几个常用的指令:

nginx -s reload  # 向主进程发T & # T h j Q M送信号,从头加载装备文件,热重启
ngino   n / 9 c X yx -s reopen	 # 重启 Nginx
nginx -s stop    # 快速封闭
nginx -s quit    # 等候作业进程处理完结后封闭
nginx -T         # 检查当时 Nginx 终究的装备
nginx -t -c <装备途径>    # 检查装备是否有问题,假如现已在装备目录,则不需求-c

systemctl 是 Linux 体系应用办理工具 se q W Q Vys [ [ ( _ sp v * , 8 { P F htemd 的主指令,用于办理体系,咱们也能够用它来对 Nginx 进行办理,相关指令如下:

systemctl staN  3 m 3 % rrt nginx    # 发动 Nginx
systemctl stop nginx     # 停止 Nginx
systemctl restart nginx  # 重启 Nginx
systemctl reload nginx   # 从头加载 Ngi& Y q ? b p h ( Mnx,用于修正装备后
systemctl enable nginx   # 设置开机发动 Nginx
systeB Y U 4 C X D xmctl disable nginx  # 封闭开机发动 Ngin[  F 6 _ Bx
systemctl status nginx   # 检查 Ng8 . ` Q G _inx 运转状况

5. Nginx 装备语法

就跟前面文件作用解说的图所示,Nginx 的主装备文件是 /etc/nginx/n, x ! (ginx.conf,你能够W u l [运用 cat -n nginx.conf 来检查装备。

nginx.conf 结构图能够这样归纳:

m. X B ^ Yain        # 大E L J v S K (局装备,对大局生效
├── events  # 装备影响 Nginx 服务器或与用户的网络衔接
├── http    # 装备署理,缓存,日志界说等绝大多数功用和第三方模块的装备
│   ├── upstream # 装备后端服务器详细地址,负载均衡装备不行或缺的部分
│   ├── server   #- D 6 o 装备虚拟主机的相关参数,一个 hW d y  bttp 块中能够有多个 server 块
│   ├── server
│   │   ├── locatioj Y # x pn  # server 块能够包括多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

一个 Ngin x G q 2 s Wx 装备文件的结构就像 nginx.conf 显示的那样,装备文件的语法规矩:

  1. 装备文件由指令与指令块构成;
  2. 每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
  3. 指令块以 {}括号将多条指令组织在一起;
  4. include 句子答应组合多个装备文件以e B – F提高可保护性;
  5. 运用 # 符号添加注释,提高可读性;
  6. 运用 $ 符号运用变量 1 x 3 v N # n
  7. 部分指令的参数支撑正则表达式;

5.1 典型装备

Nginx 的典型装备:

usY 1 ]er  nginx;                        # 运转用户,默许即是nginx,能够S G $ ` . 1不进行设置
worker_processes  1;V | ) F g J r                # Nginx 进程数,一般设置为和 CPU 核数相同E j + O : E N ] N
error_log  /var/log/nginx/error.log warn;   # Nginx 的过错日志寄存目录
pid        /var/run/nginx.pid;      # Nginx 服务发动时的 pid 寄存方位
events {
use epoll;     # 运用epoll的I/O模型(假如你不D A au ; T  D )道Nginx该运用哪种轮询办法,会主动选择一个最适合你操作体系的)A { 6 [ H
worker_connections 1024;   # 每个进程答应最大并发数
}
http {   # 装备运用最频频的部分,署理、缓存、日志界说等绝大多数功用和第三方模块的装备都在这儿设置
# 设置日志形式
log_format  main  '$remote_addr - $remote_user [$time_local] "$requez 2 ~ { r G [ sst" '
'$sD u 1 | u U 0 qtatus $body_bytes_sent 4 x j  d"$http_re2 R h Z i }ferer" '
'"$http_user_agent" "$http_x_forP ] s o L z : }warded_for"';
access_log  /var/log/nginx/access.logt } A  main;   # Nginx拜访日志寄存方位
sendfile            on;   # 敞开高效传输形式
tcp_nopul f m A O  B : 7sh          on;   # 削减网络报文段的数量
tcp_nodelay         on;
keepalive_timeout   65;   # 保持衔接的时刻,也叫超时时刻,单位秒
types_hash_max_size 2048;
includO . # / Q _ r Ie             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
default_type        application/octet-stream;   # 默许文件类型
include /etc/nginx/conf.d/*.x , W ` Nconf;   # 加载子装备项
server {C - q :
listen       80;       # 装备监听的端口
server_name  localhost;    # 装备的域名
location / {
root   /usrX P - ! ` S |/share/nginx/html;  # 网站根目录
index  index.html index.htm;   # 默许首页文件
deny 172.168.22.11;   # 制止拜访的ip地址,能够为allJ [ /
aP E # {llow 172.168.33.44# 答应拜访的ip地址,能够为all
}
error_page1 P d D | ? 500 502 503 504 /50x.html;  # 默许50x对应的拜访页面
error_page 400 404 error.html;   # 同上
}
}

server 块能够包括多个 location 块,location 指令用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
...
}

u I 4 . Q o B 令后边:

  1. = 准确匹配途径,用于不含正则表达式的 uri 前,假如匹配成功,不再进行后续的查找;
  2. ^~ 用于不含正则表达式的 uri; 前,表明假如该符R , R8 6 3 3 a d ?后边的字符是最佳匹配,采用该规矩,不再进行后续的查找;
  3. ~ 表明用该符号后边的正则去匹配途径,区别巨细写;
  4. ~. - l G L m d ^* 表明用该符号后边的正则去匹配途径,不区别巨细写。跟 ~ 优先级都比较低,如有多个location的正则能匹配的话,则运用正则表达式最长的那个;

假如 uri 包括正则表达式,则必须要有 ~~* 标志。

5.2 大局变量

Nginx 有一些常用的大局变量,你能够在装备的任何2 Y R U l x L方位运用它们,如下表:

大局变量名 功用
$host 恳求信息中的 Host,假如恳求中没有 Host 行,则等于设置的服务器名,不包括端口
$request_method 客户端恳求类型,如 GETPOST
$remote_addr 客户端的 IP 地址
$args 恳求中的参数
$arg_PARAP ) J G y } x Q BMETER GET 恳求中变量名 PARAMETER 参数f H . L + ^ u o #的值,例如:$http_user_agent(Uaer-AgA | 3 g 0 Q s = Gent 值), $http_referer
$content_length 恳求头中的q ] N R ContentO ( Y R-length 字段
$http_user_agent 客户端agent信息
$http_cookie V P e N d d户端cookie信息
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$http_user_agent 客户端agent信息
$server_protocol 恳求运用的协议,如 HTT~ = ; 3 = ^ ^P/1.0HTTP/1.1
$server_addr 服务器地址
$server_name 服务器称号
$server_port 服务器的端口号
$scheme HTTP 办法(如http,https)

还有更多的内置预界说变量,能够直接搜索关键字「nginx内置预界说变量c l v } – z g 4 1」能够看到一堆博客写这个,这些变量都能够在装备文件中直接运用。

6. 设置二级域名虚拟主机

在某某云 ☁️ 上购买了域名之后,就能; : Q – K 5 J 3够装备虚拟主机了,一般装备的途径在 域名办理o & B -> 解析 -> 添加记载 中添c & # X加二级域名,装备后某某云会把二级域名也解析到b I q l ) G咱们装备的服务器j : & s I U h IP 上,然后咱们在 Nginx 上装备一下虚拟主机8 K [ d E r M的拜访监听,就能够拿到从这个二级域名过来的恳求了。

Nginx 从入门到实践,万字详解!

现在我自己的服务器上装备了一个 fe 的二级域名,也便是说在外网拜访 fe.sherlocked93.club& C u a时分,也能够拜访到咱o p * ?们的y a b p H服务器了。

因为默许装备文件 /etc/nginx/nginx.conf 的 http 模块中有一句 include /etc/ny s ! ~ [ |ginx/conf.d/*.conf 也便是说 conf.d 文件夹下的一切 *.conf 文件都会作为子装备项被引进装备文件中。为了保护便利,我在 /etc/nginx/conf.d 文件夹中新建一个 fe.sherlocked93.club.conf

# /etc/nginx/coA Z * ynf.d/fe.sherlocked93.club.coP C { c q ; 2 Qnf
server {
listen 80;
server_name fe.sherlocked93.club;
location / {
root  /usr/share/nginx/html/fe;
index index.html;
}
}

然后在 /usr, 6 ; Y/share/nginx/html 文件夹下新建 fe 文h c x a x $` L =夹,新建文件 index.html,内容随便写点,改完 ngi- D ^ Q f 7 Pnx -s reload 从头加载,浏览器中输入 fe.sherle _ ! + B , N Tocked93.club,发现从二级域名就能够拜访到咱们刚刚新建的 fe 文件夹:

Nginx 从入门到实践,万字详解!

7. 装备反向署理

反向署理是作业中最常用的服务器功用,常常被用来处理跨域B % k { K G k i *问题,下面简略介绍一下怎样完结反向署理。

首要进入 Nginx 的主装备文件:

vim /etc/nginx/nginx.conf

为了看起来便利,把行号显示出来 :set nu (个人习气),然后咱们去 http 模块的 server 块中的 location /,添加一行将默许网址重定向到最大学习网站 Bilibili 的 proxy_pass 装备 :

Nginx 从入门到实践,万字详解!

改完保存退出,nginx -s reO ! N {load 从头加x | ` d n # –载,进入默许网址,那么现在就直接跳转到 B 站了,完结了一个简略的署理。

实际运用中,能够将恳求转发到本机, K ` F n E ? K .另一个# h j kQ f x U L 2 E务器上,也能够依据拜访的途径跳转到不同端口的服务中。

比方咱们监听 9001 端口,然后把拜访不同途径的恳求进行反向署理:@ } – y

  1. 把拜访 http://n a e ` F127.1 $ ] S0.0.1:9001/edu 的恳求转发到 http://127.0.0.1:8080
  2. 把拜访 http://127.0.0.1:9001= | # [ y M y J/vod 的恳求转发到k y g L z h http://127.0.0.1:8081

这种要怎样装p d q @ 8 U w x Q备呢 z 4 S } q 8,首要同样翻开主装备u L 7 @ b文件,然后在 http 模块下添加一个 server 块:

server {
listen 9001;
ser3 n d g - F q J Jver_name *.sherlocked93.club;
locata + p @ |ion ~ /edu/ {
proxy_pass http://` / @ o v P127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}

反向署理还有一些其他的指令,能够了解一下:

  1. proxy_set_header:在将客户端恳求发送给后端服务器之前,更改来自客户端的恳求头信息。
  2. proxy_connect_timeout:装备Nginx与后端E @ l j l % ] 9署理服务器测验树立衔接的超时时刻。
  3. proxy_read_timeout:装备Ngi5 J Z A 0 & 6nx向后端服L t T `务器组宣布read/ 2 V K A恳求后,等候相m Z Q E $应的超时时刻。
  4. proxy_send_timeout:装备Nginx向后端服务器组宣布write恳求后,等候相应的超时时刻。
  5. proxy_redirect:用于修正后端服Q u K务器回来的呼应头中的Location和Reo U ! k {fre! 6 ush。

8. 跨域 CORS 装备

关于简略恳求、v c d Q * i b [非简略恳求、w B ;跨域的概念,前面现已介绍过了,还不了解的能够看看前面的解说。现在前后E 0 w u M v 3 D 6端别离的项目一统天下,常常本地起了前/ 5 j H [ V L k端服务,需求拜访不同的后端地址,不行避免遇到跨域问题。

Nginx 从入门到实践,万字详解!

要处理跨域问题,咱U _ { :们来制造一个跨域问题。首要和前面设置二级域名的方法相同,先设置好 fe.X p . Q e : /sherlocked93.clubbe.sherlocked93.c_ z ? 4 3 e b blub 二级域名,都指向本云服务器地址,尽管对应 IP 是相同的,可是在 fe.sherlocked93.club 域名宣布的恳求拜访 b! L 7 d te.she0 , P * V ! 6 *rlocked93.club 域名的恳求仍是跨域了,因为拜访的 host 不一致(假如不知道啥F e c 3 n H ,原因拜: 8 ~ /见前面跨域的内容)。x D [

8.1E [ H d V M 运用反向署理处理跨域

在前端服E P +务地址为 fe.sherlocked93.club 的页面恳求 be.@ / O i | ] .sherlocked93.club 的后端服务导致的跨域,能够这样装备:

server {
listen 9001;
server_name fe.sherlocked93.club;
location /! { g v {
proxy_pass be.sherlocked93.8 d M _ ` Iclub;
}
}

这样就将对前一个域名 fe.sherlocked93.club 的恳求全i B $都署理到了 be.sherlocked93.club,前端的恳求都被咱们用服务器署理到了后端地址下,绕过了跨域。

这儿对静态文件的恳求和后端服务的恳求都以 fe.sherlocked93.clubx / A ) P ; ~端,不易区别,所以为了完结对后端服务恳求的一致转发,一般咱们会约好对后端服务的恳求加上 /apis/ 前缀或许其他的 path 来和对 C ~ j @ K静态资源的恳求加以区别,此刻咱们能够这样装备:

# 恳求跨域,约好署理后端服务恳求path以/apis/最初
location ^~/apis/ {
# 这儿重写了恳求,将正则匹配中的第一个分组的path拼接到真正的恳求后边,并用break停止后续匹配
rewrite ^/apis/(.= + * 8 # ` 1 @*)$ /$1 break;
proxy_pas! $ V = s { ? T ys be.sher/ ( # ? S u u .locked93.club;
# 两个域名之间cookieN & C ; $ i M 5的传递与回写
proxy_cookie_domal n ? 2  C &in be.sherlocked93.cm , N @ 1 2 Plub fe.sherlocked93.club;
}

这样,静 W M W A态资源咱们运用 fe.sherlocked93E k B Q m Q y.club/xx.html,动态资源咱们运用 fe.J ( g J , - m usherlocke+ J 5 C s t 7 fd93.club/apis/getAwo,浏览器页面看起来依然拜访的前端服务器,绕过了浏览器的a . . A = { U 9同源战略,毕竟咱们r } v 3 Z看起来并没有跨域。

也能够一致一点,直接把前后端服务器地址直接都转发到另一个 server.sherlocked93.club,只经过在后边添加的 path 来区别恳求的是静态资源仍是后端服务,看需求了。

8.2 装备 header 处理跨域

当浏览器在e r C 6 O X拜访跨源的服务器时,也能够在跨域的服务器上直接设置 Nginx,从而前端就能够无感地开发,不必把实际上拜访后端的地址改成前端服务的地址,这样可适性更高。

比方前端站点是 fe.sherlocked93.club,这个地址下的前端页面恳求 be.sherlocked93.clG 2 a S # X { g gub 下的资源,比| } N h Z I % h& | | S &前者的 fe.sherlocked93.club/index.html 内容是这样的:

<html>
<body>
<h1>welcome fe.sherlocked93.club!!<h1>
<script type='text/javascript'>
var xmlhttp = new XMLHttpRequest()
xml} 9 - Hhttp.open("GET", "http:/( f W/be.sherlocked93.club/index.htJ t 6 | % fml", true);
xmlhttp.send();
</script>
</body&gt) r Q H @ [;
</html>

翻开浏览器拜访 fe.sherlocked93.club* v Q U L M/index; _ 9 = { c ?.html 的成果如下:

Nginx 从入门到实践,万字详解!

很明显这儿是跨域恳求,在浏览器中直接拜访 http://be.sherlocked93.club/index.html 是能够拜访到的,可是在 fe.sherlocked93.club 的 html 页面拜访就会呈现跨域。

/etc/nginx/conf.d/ 文件夹中新建一个装备文件,对应二级域名 be.sherlocked93.club

# /etc/nginx/cP b Jonf.d/be.sherlocked93.club.conf
server {
listen 6 D + t m b d       80;
server_name  be.sherlocked93.club;
add_header 'AccH u 9 a x ( t  Less-Control-AlloP = 9 b o 2w-Origin'f E 8 $http_origin;   # 大局变量取得当时恳求origin,带cookie的恳求不支撑*
add_head+ { p 0 per 'Access-Control-Allow-Credentials' 'true';    # 为 true 可带上 cookie
add_header 'Access-Co[ 3 I I ! k V Ontrol-Allow-Methods' 'GET, POST, OPTIONS';  # 答应恳求办法
add_header 'Access-Control-Allow-Headers' $http_access_control_request_heK G c N ? a z V Vaders;  # 答应恳求的 header,能够为 *
add_header 'Access-C6 P O  bontrol-ExpoD c + G H Ise-Headers'Y Q K & * 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;   # OPTIONS 恳求的有效期,在有效期内不必宣布另一条预检恳求
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_hI 6 L ^ t O Peader 'Content-Length' 0;
re8 a p oturn 204;                  # 200 也能够U R ] B v h b w
}
location / {
root  /usr/share/nginx/html/be;
i? I .ndex index.html;
}
}

然后 nginx -s reload 从头加载装备。这时再拜访 fe.sherlocked93.? Q 2club/inG T ) O Adex.html 成果如下,恳求中呈现了咱们刚刚装备的 Header:

Nginx 从入门到实践,万字详解!

处理了跨域问题。

9. 敞开 gzip 紧缩

gzip 是一种常用的网页紧缩技术,传输的网页经过 gzip 紧缩之后巨细一般能P ( Z H O够变为原来的F P z r T j @ 3 Q一半甚至更小R 2 C ) r 9 P Q(官网原话),更小的网页体积也就意味着带宽的节约和传, u S $ M R . * P输速度的提高,特别是关于拜访量巨大大型网站来说,每一个静态资源体积的减小,都会带来可C f j 6 L + j @观的流量与带宽的节约。

百度能够找到许多检测站点来检查方针[ U j f & @ ( l [网页有没有敞开 gzip 紧缩,鄙人随便找了一个Y 6 . d L <网页GZIP紧缩检测> 输入掘金 juejin.im 来偷窥下= O ` p R掘金有没有敞开 gzip。

Nginx 从入门到实践,万字详解!

这儿能够看到掘金是敞开了 gzip 的,紧缩作用还挺不错,达到了 52% 之多,原本 34kb S r % ~ { l }网页体积,紧缩完只需求 16kb,能够E { : .想象网页传输速度B 1 R A U y +提高了不少。

9.1 Ngin= u [ } 9 W j –x 装备 gzip

运用 gzip 不仅需求 Nginx 装备,浏览器端也需求配合,需求在恳求音讯头中包括 Accept-Encw b 8 y aoding: gzip(IE5 之后一切的浏览器都支撑了,是现代浏览器的默许设置)。一般在恳求 html 和 css 等静态资源的时分,支撑的浏览器在 requestX 2 V 恳求静态资源的时分,会加上 Accept-Encoding: gzip 这个 header,表明自己支撑 gz* ! n M : K ( =ip 的紧缩方法,Nginx 在拿到f . m e 4这个恳求的时分,假如k 3 { c有相应装备,就会回来经过 gzip 紧缩过的文件给浏览器,并在 response 相应的时分加上 content-encoding: gzip 来告知浏览器自己采用的紧缩方法(因为浏览器在传给服务J H 8 J 0器的时分一般还告知服务器自己支撑好几种紧缩方法),浏览器拿{ B c到紧缩的文件后,依据自己的解压方法进行解析。

先来看看 Nginx 怎样进行 gzip 装备,和之前的装备相同,为了便利办理,仍是在 /etc/nginx/conf.d/ 文件夹中新建装备文件 gzip.c& m P Zonf

# /etc/nginx/conf.d/gzip.conf
gzip on; # 默许off,是否敞开gzip
gzip_types text/plain text/css application/json m C * * / O Y A application/x-javascript text/xml application/xml application/xml+rss te# r T 6 P : #xt/javascript;
# 上面两个敞开根本就能跑起了,下面H _ / t ^ . 8的愿意折腾就了解一下
gzip_static on;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzi, i b c g _ ]p_buffers 16 8k;3 6 n
# gzip_min_lengthW t u h * 3 # 1k;
gzip_http_version 1.1;

略微解释一下:

  1. gzip_types:要采用 gzip 紧缩的 MIME 文件类型,其间 teu H . Q @ 1 ^ C ^xt/html 被体系强制启S E e用;
  2. gzip_static:默许 off,z j E d =该模s D C块启用后,Nginx 首要检查是否存在恳求静态文件V p b 5 , E b 8的 gz 结尾的文件,假如有则直接回来该 .gz 文件内容;
  3. gzip_proxied:默许 off,nginx做为反向署理时启用,用于设置启( / ? E z [ _ x用或禁用从署理n o 7 | ? o ;服务W ^ q Y器上收到相应内容 gzip 紧缩;
  4. gzip_vary:用G @ C 4 j O于在呼应音讯头中添加 Vary:Accept-Encoding,使署理服| N ^ ! f ) z i务器C P 9 7 C U ~ 依据恳求头* x a o中的 Accept-Encoding 辨认是否启用 gzip 紧缩;
  5. gzE V ) ]ip_comp_level:gzip 紧缩D , i L @比,紧缩等级是 1-9,1 紧缩等r ! V M g h 7级最低,9 最高,等级越高W | p ! 紧缩率越大,紧缩时刻越长,主张 4-6;
  6. gzip_buffers:获取多少内存用于缓存紧缩成果,16 8kv j K R h M 表明以 8k*16 为单位取得;
  7. gzip_min_length:答应紧缩的页面最小字节数,页面字节数从ha U /eader头中的 Content-LengD ^ [ Uth 中进行获取。默许值是 0,不管页面多大都紧缩。主张设置成大于 1k 的字节数,小于 1k 或许会越压越大;
  8. gzip_http_versioni ] N:默许 1.1,启g 1 d用 gzip 所需的 HTTP 最低版别;

这个装备能够插入到 http 模块整个服务器的装备里,也能够插入到需求运用的虚拟主机的 server 或许下面的 location 模块中,当然像上面咱们这样写的话便是被 includ– A $ | f m b s Pe 到 http 模1 N k j `块中了。

其他更全的# d 1装备信息能够检查 <官网文档ngx_http_gzip_module>,装备前是这样的:

Nginx 从入门到实践,万字详解!

装备之后 response 的 heade ^ M ? + 2r 里边多了一个 Content-P # , PEncoding: gzip,回来信息被紧缩了:

Nginx 从入门到实践,万字详解!

留意了,一般 gzip 的装备主张加上 gzip_min_length 1k,不加的话:

Nginx 从入门到实践,万字详解!

因为文件太小,gzip 紧缩之后得到了 -48% 的体积优化,紧缩之后体积还比紧缩之E = & 2 i @ p前体积大了,所以最好设置低于 1kb 的文件就不要 gzip 紧缩了

9.2 W* $ z d M ^ Mebpack 的 gzip 装备

当时端项目运用 Webpack 进行打包的时分,也能够敞开 gzip 紧缩:

// vue-cli3 的 vue.conf] [ w ~ f 9 g R rig.js 文件
const CompressionWebpacb h f d w d kPlugin = require('compression-webpack-plugin')
module.exports = {
// gzip 装备
configureWebpack: config =&gl P  W &t; {
if (process.env.NODEi W ] W - E @ G_ENV === 'production') {
// 出产环境
return {
plugij J E 3ns: [newJ r x ) & / 9 N ^ CompressionWebpackPlugin({
test: /.js$|.html$|.css/,    // 匹配文件3 u D C T 6
threshold: 10240,               // 文件紧缩阈值,对超越10k的进行紧缩
deleteOriginalAssets: false     // 是否删去源文件
})]
}
}
},
...
}

由此打包出来的文件如下图:

Nginx 从入门到实践,万字详解!

这儿能够看到某些打包之后的文件下面有一个对应的 .gz 经过 gzip 紧缩之后的文件,这是因为这个文件超越了 10kb,有的文件没有超越 10kb 就没有进行 gzip 打包,假如你期望紧缩文件的体积阈值小一点,能够在 compression-webpack-plu# R A 2 l j Egin 这个插件的装备里进行对应装备。

那么为啥这儿 Nginx 现已有了 gzip 紧缩,Webpack 这儿又整了个 gzip 呢,因为假如全都是运用 Nginx 来紧缩文件,会消耗服务器的核算资源,假如服务器的 gzip_cj Y C @ $omp_levem I Pl 装备的比较高,就更添加服务器的开支,相应添加x 6 S J m L 7客户端的恳求时刻,得不偿失。

假如紧缩的动作在前端打包的时分就做了,把打包之后的高紧缩等级文件作为静态资源放在服务器上,Nginx; r – ` r 3 w 会优g X ? J ] O a先查找这些紧缩之后的文件回来给客户端,相当于把紧缩文件的动作从 Nginx 提前给 Webpack 打包的时分完结,节约了服务器资源,所以一般推介在出产环境应用 Webpack 装备 gzip 紧缩。

10. 装备负载均衡

负载均衡在之前现已介绍了相关概念了,首要思想便是把负载均匀合理地分发到多个服务器上q t V m,完结压力分流的意图。

首要装备如下:1 + { b @ V

http {
upstream myserver {
# ip_hash;  # ip_hash 方法
# fair;   # fair 方法
server 127.0.0.1:8081;  # 负载c 1 m ) 3 6 - 2 f均衡意图服务地址
server 127.0.0.1:8080;
server 127.0.0.1:8082 weight=10;  # web O 9 k 5 o d 3 might 方法,不写默许为 1
}
server {
location / {
proxy_pass http://myserver;
proxy_connect_timeout 10;
}
}
}

NV ^ 4 ^ V 7 ?gF B m O S K T 0inx 供给了好几种分配n N $ G [ ! 5方法,默许为轮询,便是轮流来。| h & b c 8有以下几种分配方法:

  1. 轮询,默许方法,每个恳求按时刻次序逐个分配到不同的后端服务器,假如后端服务挂了,能主动除掉;
  2. weight,权重分配,指定轮询几率,权重越高,在被拜访的概率越大,@ b 0 $用于后端服务? ^ t s器功用不均的情况;
  3. ip_hash,每个恳求按拜访 IP 的 hash 成果分配,这样每个访客固定拜访一个后端服务器,能够处理动态网页 session 同享问题。负载均衡每次恳求都会从头定位到服务器集群中的某一个,那么现已登录某一个服务器的用户再从头定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的;
  4. fair(第三方),按后端服务= H N x F n a器的呼应时刻分配,呼应时刻短的优先分配,依赖第三方插件 nginx-upstream-fair,需w k _ | ) h 6求先装置;

11. 装备动态别离v o V G Y 6 l 9

动态别离在之前也介绍过了,便是把动态和静态的恳求a ~ M F :分隔。方法首要有两种,一种 是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推重的方案。别的一种办法便是动态跟静态文件混合在一起发布, 经过 Nginx 装备来分隔。

经过 locQ p g x 9 p s b Qation 指定不同的后缀名完结不同的恳求转发。经过T @ C _ d a 5 ! expires 参数设置,能够使浏览器缓存过期时刻,削减与服务器之前的s * 9 :恳求和流量。详细 expires 界说:是给一个资源设定一个过期时刻,也便是说无需去服务端验证,直接经过浏览器自身确认是否过期即, * } R可,所以不会发生额定的流量。此种办法十分适合不常常变动的资源。(假如常 9 i常更新的文件,不主张运用 expires 来缓存),我这儿设X O } R置 3d,表明在这S [ m . k 7 ] T . 3 天之内拜访这个URL,发送一个恳求,比对服务器w * ; / . 1 =该文件最m & 4 9 (后更新U g O L Q M 7 ] !时刻没有变化。则不m M 9 . D会从服务器抓取,回来状况码 304,假如有修正,则直接从服务器从头下载,回来状况码 200。

server {
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
}
}

12. 装备高可用集( g * e K s g N群(双机热备)

当主 Nginx 服务器宕机之后,切换到备份 Nginx 服务器

Nginx 从入门到实践,万字详解!

首要装置 keepalived,

yum install keepa0 A n Y } 9lived -y

然后修改 /etc/k7 - Y eepalived/keepalived.conf 装备文件,并在装备文件中添加 vrrp_script 界说一个外围检测机制,并在 vrrp_instance% _ 3 g 中经过h ^ l ; 8界说 track7 B ~ r X q # I_script 来追踪脚本执行进程,完结节点转移:

global_defs{
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30 // 上面都是邮件装备,没卵用
router_id LVS_DEVEL     // 当时服务器姓名,用hostname指令来检查
}
vrV ~ ; S I - k ^rp_script chku @  O 9 - n_maintainace { // 检测机制的脚本称号为ch$ o r }  G X 5k_maintainac7 ! X  E F }e
script "[[ -e/etc/keepalived/down ]] && exit 1 || exit 0" // 能够是脚本途径或脚本指令
// script "/etc/keepalived/ng? o ninx_check.sh"    // 比方这样的脚本途径
interva= l W ,l 2  // 每隔2秒检测一次
weight -20  // 当脚本执行成立,那么把当时服务器优先级改为-20
}
v= r 4rrp_instanceVI_1 {   // 每一个vrrp_instance便是界说一个虚拟路由器
state MASTER      // 主d j z v ] J f w t机为MASTER,备用机为BACKUP
interface eth0    // 网卡姓名,能够从ifconfig中查找
virtual_router_id 51X U Q $ // 虚拟路由的id号,一般小于255,主备机id需求相同
priority 100      // 优先级,master的优先级比backup的大
advl ; } 6ert_int 1      // 默许I s @ (心跳间隔
authentication {  /$ J c P b / 认证机制
auth_type PASS
auth_pass 1111   // 暗码
}
virtual_iZ x 0 K t U 0 l 2paddress {  // 虚拟地址vip
172.16.2n w g j.8
}
}

其间检测脚本 nginx_checu E 3k.sh,这儿供给一个:

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/sbiI h Cn/nginx # 测验K Z 5 j e v从头发动nginx
sleep 2         # 睡觉2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall ke: H s q q ^ G A }epalived # 发动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
fi

仿制一0 b L n份到备份服务器,备份 Nginx 的装备要将 state 后改为 BACKUPpriority 改为比主机小。

设置结束后各自 ser| 1 D 6 avice keepalived startQ 2 y动,经过拜访成功之后,能够把 Mas~ K { V 0 { l iter 机的 keepalived 停掉,此刻 Master 机就不再是主机了 service keepalived stop,看拜访虚拟 IP 时是否能够主动切换到备机 ip addr

再次发动 Master 的 keepalived,此刻 vip 又变到了主机上。p a x $

13D j Z V W } ! 6 c. 适配 PC 或移动设备

依据用户设备不同回来不同款式的站点,以前常常运用的是纯前端的自适应布局,但I a j O f c b ;无论是杂乱性和易用性上面仍是不如分隔编写的好,比方咱们常见的淘宝、京东……这些大型网站就都没有采用自适应,7 g 6 G A # 0 H D而是用分隔制造的方法,依据用户恳求的 user-agent 来判别是回来 PC 仍是 H5 站点。

首要在 /usr/share/nginx/html 文件夹2 N 7 F ] Vmkdir 别离新建两个文件夹 PCmobilevim 修改两个 index.html 随便写点内容。

cd /usr/share/nginx/html
mkdir pc mobile
cd pc
vim in= # ( F Ldex.html   # 随便写点比方 hello pc!
cd ../mobile
vim index.html   # 随便写点比方 hell, O c k V C # Ao mobile!

然后和设置二级域名虚拟主机时分相同,去 /etc/nginx/conf.d 文件夹下新建一个装备文件 fe.sherlocked93.club.co$ 6 p r q t = f ;nf

# /etc/nginx/conf.d/fe= o # { y f _ V.sherlocked93.club.conf
server {
lw x  Q p w Histen 80;
server_name fe.sherlocked93.club;
location / {
root  /usr/share/nginx/html/pc;
if ($http_user_agI # I c X Sent ~* '(Andt # $ roid|webOS|iPhone|iPod|BlackBerry)') {
root /usr/share/nginx/html/mobile;
}
index index.html;
}
}

装备根O o v N = a U s本没什么不相同的,首要多了一个 if 句子,然后运用 $http_user_agent 大局变量来判别K u a : W a 9用户恳 z ;求的 user-agent,指向不同的 root 途径,回来对应站点。N w y ) j G T R

在浏览器拜访这个站点,然后 F12 中模仿运用手机拜访:

Nginx 从入门到实践,万字详解!

能够看到在模仿运用移动端拜访的时分,Nginx 回来的站点变成了移动端对应的 html 了。

14. 装备 HTTPS

详细装备进程网b P + &上挺多的了,也能够运用你购买的: O I l s _ *某某云,一般都会有免费恳求的服务器证书,装置直接看所在云的操作指南即可。

我购买的腾讯云供给的亚洲诚信组织颁发的免费证书只能一个域名运用,二级域名什么的需求别的恳求,可是恳求批阅比较快,一般几分钟就能成功,然后下载证书= S s @ @ =的紧缩文件,里边有b , k G个 nginx 文件夹,把 xxx.crtxxx.key 文件拷贝到服务器目录,再装备下:

server {
listen 443 ssl ht0 x & 1 c p * 0 vtp2 default_serZ 1 & [ 3 Xver;   # SSL 拜访端口号为 443
server_name sherlocked93.club;         # 填写绑定D i p / t Y * d 7证书的域名
ssl_certificate /eE l stc/nginx/https/1_sherlocked93.club_bundle.crt;   # 证书文件地址
ssl_certificate_key /etc/nginx/https/2_sherlocked93.club.key;      # 私钥文件地址
s~ 4 J y q O V  tsy t G  2 Vl_sessib ; I K & ) { ?on_timeout 10m;
ssln N C O J_protocols TLSv1 TLSv1.1 TLSv1.2;      #请依照以下协议装备
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:t ] r s g q!DHE;
ssl_prefer_server_ciphers on;
location / {
root         /us} ~ I 8 B l F # .r/share/nginx/html;
index        index.html indel | h .x.ht% Y ^ 4 W 9 L +m;
}
}

写完 nginx -t -q 校验一下,没问题就 nginx -s reload,现在去拜访 https://sherlocked93.club/ 就能拜访 HTTPSJ / A F 2 M P u 8 版的网站了。

一般还能够加上几个增强安全性的指令:

add_y n [ 9 @ B Gheadeb a } @r X-FraI = F w ! N K Mme-Options DENY;           # 削减点击劫持
add_header X-Conte@ & o / Fnt-Type-Ow 0 Y Q 9 W Q d *ptions nosniff; # 制止服务器主动解析资源类型
add_header X-Xss-Protection 1;             # 防XSS进犯

15. 一些常用技巧

15.1 静态服务

server {
listen 0 p  1 @ b       80;
server_name  staticS K  w o o S $ P.sherlocked93.club;
charset utf-8;    # 避免中文A 4 _ # + { 7 i文件名乱码
location /download {
alias	          /usrD [ } @ H t :/share/nginx/html/static;  # 静态资源目录
autoindex               on;    # 敞开静态资源列目录
autoindex_ex [ o b @ m f Bxac1 f # B 9 ` * Bt_size    off;   # on(默许)显示文件的切当巨细,单_ k z ( + v ~ + r位是byte;off显示文件大约巨细,单位KB、MB、GB
autoindex_loP g f 6caltime     of@  K Xf;   # off(默许)时显示的文件时刻为GMT时刻;on显示的文件时刻为服务器时刻
}
}

15.2 图片p y G 1 Z防盗链

server {
listenl S + 5 w x W *       80;
server_name  *.sherlocked93.club;
# 图片防盗链
loN $ _cation ~* .(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked server_names ~.google. ~.baidu.7 } 1 Y *.qq.com;  # 只答应本机 IP 外链引用,感谢 @木法传 的提示,将百度和谷7 u B 3歌也参加白名单
if ($invalid_referer){
return 403;
}
}
}

15.3 恳求过滤

# 非指定V m T J t恳求全回来 403K 2 ( Z * P T
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
location / {
# I( C 3 ; ` % cP拜访约束(只答应IP是 192.1688 3 ` . T p.0.2 机器拜访)
allow 192.168.0.2;
dem 7 Any all;
root   html;
index  index.html index.^ f shtm;
}

15.4 装备图片、字体等静态文件缓存

因为图片、字体、音频、视频等静态文件在打包的时分一般会添加了 hash,所以缓存能够设置的长一点,先设置强制缓存,再设置洽谈缓存;假如存在没P O v有 hash 值的静态文件,主张不设置C b ;强制缓存,仅经过洽谈缓存判别是否需求运用缓存。

# 图片缓存时刻设置
location ~ .*.(css|js|jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|m4a|aac|txt)$ {
expires 10d;
}
# 假如Q g D不期望缓存
expiresZ D ; -1;

15.5 单页面项目 history 路由装备

server {
listen       80;
server_name  feT c q l ; ?  |.sherlocked93.club;
location / {
root       /usr/share/nginx/html/dist;  # vue 打包后的文件夹
index      inde K * 9x.html index.htm;
try_files  $uri $uri/ /index.html @rewrites;
expires -1;                          # 首页一般没有强制缓存
add_header Cache-Control no-cache;
}
# 接口转发,假如需求的话
#location7 ) x v ~ ^/api {
#  proxy_passd | D G http://be.sherlocked93.- P Y n | X Z z ;club;
#W = ] `}
location @rewrites {
rewrite ^(.+)$ /index.html break;
}
}

15.6 HTTP 恳求转发到 HTTPS

装备完 HTTPS 后,浏览器仍是能够拜访 HTTP 的地址 http://sherlocked93.club/ 的,能够做v ( P i =一个 301 跳转,把对应域名的 HTTP 恳求重定向到 HTTPS 上

server {
listen      80;
seJ * L 4 } j 7 : rver_name www.sherlocked93.club;
# 单域名重定向
if ($host = 'www.sherlocked93.0 9 N G 7 v P ~ {club'){
retuF X $ jrn 301 https://www.sherlocked93.club$request_uri;
}
# 大局非 https 协议U ? 7 { ] P D 3 l时重定向
if ($scheme != 'https') {
return 301 https://$server_name$request_uri;
}
# 或许悉数重定向
return 301 https://$server_name$request_uri;
# 以上装@ J x k y W Q备选择自己需求的即可,不必悉数加
}

15.h n }7 泛域名途径别离

这是一个十分实用的技能,常常有时分咱们或许需求装备一些二级或许三级域名,期望经过 Nginx 主动指向对应目录,比方:

  1. test1.doc.sherlocked93.club 主动指向 /usr/share/ng] ! Oinx/html/doc/test1 服务器地址;
  2. test2.doc.sherlocked93.club 主动指向 /usr/share/nginP X h * o $x/html/doc/tesw i =t2 服务器地址;
server {
listen       80;
sJ L 9 P s [erver_name  ~^([w-]+).docY @ W.sherlocked93) + & j.cB k ? b @ J M +lub$;
root /usr/share/nginx/html/doc/$1;
}

15.8 泛域名转发

和之前的功用相似,有时分咱们期望把二级或许三级域名链接重写到咱们P n 4 x 2 ! H c `期望的途径,让后端就能够依据路由解析不同的规矩:

  1. test1.serv.sherlocked93.clu} . & 0 ib/api?name=a 主动转发到 127.0.0.1:8080/test1/api?nm d * C f . rame=a
  2. test2.serv.sherlocked93.club/api?nam` A 6 ` i % . T Ze=a 主动转发到 1: = 7 { u 8 } ] 27.0.0.1:8080/test2/S D 3api?namB # x e Y qe=a
server {
listen       80;
server-  V A_name ~^([w-]+).serv.sherlocked93.clu= k `b$;
los q G s Z ) 7 b Zcat6 y Y d 0 K b yion / {
proxy_set_header        X-Real-IP $remote_addr;
proxy_sW i D B i c [et_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Host $http_host;
proxy_set_header        X-NginX-Proxy true;
proxy_ q O s p e 5 Y fpass              http://127.0. ~ ~ , l g (0.1:8080/$1$request_uri;
}
}

16. 最佳实践

  1. 为了使 Nginx 装备更易于保护,主张为每个服务创立一个单独的装备文件,存储在 /etc/nginx/conf.d 目录,依据需求能够创立恣意多个独立的装备文件。
  2. 独立的装备文件,主张遵从以下命名约好 <0 ; 7 P W [服务&t m # K u R N pgt;.conf,比方域名是 sherlocked93.club,那么A – 8 K你的装备文件的应该是这样的 /etc/ngE p e uinx/conf.d/sherlocked93.club.conf,假如布置多个服务,也能够在文件名中加上 Nginx 转d c ( # w g o发的端口号,比方 sherlocked93.club.8080.coH r ~nf,假如是二C [ p I ; D 9 1级域名,主张也都加上 fe.sherlocked93.cluQ P 8 4 T X l Db.conf
  3. 常用的、复用频率比较高的装备能够f w 0 l v ?放到 /etc/nginxQ V ` C/snippets 文件夹,在 Nginx 的装备文件中需求用到的方位 include 进去,以功用来c . q m A T @命名,y L p并在每个 snippet 装备文件的最初注释标明首要功用和引进方位,便利办理。比方之前的 gzipcors 等常用装备,我都设置了 snippet。
  4. Nginx 日志相关目录,内以 域名.type.log 命名(比方 be.sherlocked93.club.access.logbe.sherlocked93.c( h O vlub.er u W m f a Hror.log )坐落 /var/log/nginx/ 目录中,为每个独立的服务装备不同的拜访权限和过错日志文件,这样查找过错时,会愈加便利快捷。

S H j谢 @木法传 的提示,Nginx 设置防盗链的时分,能够将百O a j d = c s度和 google 设置为白名单,利于s ? M ` SEO


网上的帖子大多深浅不一,甚至有些前后矛盾,鄙人的文章都是学习进程中的总结,假如发现过错,欢迎留言指出~

参阅文档:

  1. Nginx中文文档
  2. Nginx装置,目录结构与装备文; B E ? G 3 Z c件详解
  3. Keepalived装置与装备y h F g A o K 1
  4. Keepal? s , Y Yived+Nginx完结高可用
  5. Nginx与前端开发
  6. L s n d域资源同享 CORS 详解 – 阮一峰的网络日志
  7. 前端开发者必备的nginx知识
  8. 我也说说Nginx处理前端跨域问题,正确的Nginx跨域装备
  9. vue-router history形式nginx装备并装备静态资源缓存 | HolidayPengul k ~in
  10. nginx重定向,大局https,SSL装备,反代装备参G = g a +
  11. Nginx 入门教程

PS:自己博客地D j 8 & ` g S 址 Github – SHERlocked93/blogb k ^,也欢迎咱们重视我的公众号【前端下午茶】,一起加油吧~

Nginx 从入门到实践,万字详解!

别的能够参加「前端下午茶交流群」微信群,长按辨认下面S k @ ` % L P二维码即可加我老友,备注加群,我拉你入群~

Nginx 从入门到实践,万字详解!