共计 7670 个字符,预计需要花费 20 分钟才能阅读完成。
这是一系列 收费 的常识,有 图文版 和视频版,你当初看到的是图文版。
NGINX 系列课分为三篇,根底篇、进阶篇和企业实际篇,你当初正在浏览的是 根底篇。
视频版公布在我本人的社区,喜爱看视频的敌人可返回社区,微信扫码登录或微信受权 登录后即可播放。
写在后面
根底篇学习目标:理解 NGINX,并可能本人入手操作,能独立实现负载平衡配置,并绑定域名,实现通过域名拜访后端服务。
NGINX 系列课课学习目标:理解 NGINX、可能本人独立实现负载平衡配置、可能本人搭建高可用的企业级生产环境、对 NGINX 进行监控。
听过视频课的敌人曾经可能独立实现负载平衡配置了,还提交了作业
咱们这半年,将会输入十分多公开课,有图文版、有视频版。重要的是,这些都是收费的!!! 来了就能听。课程清单 如下
其中绿色标注的是曾经公布的内容,红色的是正在筹备素材的内容。
NGINX 根底篇图文版
好的,正题来了,开始吧。
如果平时接触后端或者服务器比拟少的敌人可能会问,NGINX 是什么?
对于它是什么,咱们能够援用 NGINX 官网和百度百科中的介绍,NGINX 是一款高性能的 HTTP 服务器,同时也是一款反向代理服务器(NGINX 官网原文称为 reverse proxy server
)。除了反对 HTTP 协定外,还反对邮件协定、TCP/UDP 等。
它可能 做什么?
在我看来,它其实是一款网关。作用 1 申请转发,作用 2 限流,作用 3 鉴权,作用 4 负载平衡。下面提到的反向代理 reverse proxy server
,能够归类到申请转发。
正向代理,反向代理???
太多情理咱们就不讲了,能够浏览其余平台上对于这个问题的解读 https://zhuanlan.zhihu.com/p/…
这里咱们简略总结一下,正向代理代理的对象是 客户端 ,反向代理代理的对象是 服务端。
做爬虫的敌人们,平时你们用的 IP 代理就是正向代理,爬虫程序通过代理,将申请转发给后端。而咱们提到的 NGINX 反向代理则是将客户端的申请转发到后端。从下面讲到的文章里借几张图
用 NGINX 的公司多吗?
大部分公司都有用到 NGINX,大至 Google Meta(Facebook) Amazon Alibaba Tencent HUAWEI,小至全世界 70%+ (我猜的,理论比这更多)的互联网企业,社区应用的也是 NGINX
装置 NGINX
装置基于 Ubuntu20.04,云服务器。根底篇先通过疾速装置,让咱们能够操作起来,学一些根底,后续进阶篇会有编译装置。
关上 Terminal,执行 sudo apt install nginx -y
,期待命令执行即实现装置。装置实现后它会自行启动,大家拜访本人服务器的地址即可,例如我的服务器 IP 是 101.42.137.185
,那我拜访的是 http://101.42.137.185
如果页面显示的是 Welcome to nginx
字样,阐明服务失常。如果没有,请查看装置时 Terminal 输入的错误信息,或者查看本人的防火墙、平安组策略等(如果不懂,或者怎么操作也不对,能够通过社区之前公布的 Linux 云服务器公开课学习)
NGINX 根本工作原理和模块关系简述
NGINX 有一个主过程和多个工作过程。主过程用于保护本身运行,例如读取配置、解析配置、保护工作过程、从新载入配置等等;工作过程才是具体响应申请的过程。
工作过程数可在配置文件中调整。
NGINX 由模块组成,这些模块受配置文件中的配置操控,也就是说配置文件决定了 NGINX 的工作形式。
这里还是援用其余文章,就不本人一一写明了。NGINX 原理和架构能够参考 https://zhuanlan.zhihu.com/p/…,实际上在初期咱们须要关注的只有一个中央,也就是模块那局部,轻易看看做个大体理解即可,不用深刻。
NGINX 的信号
信号,这里指的是管制信号。信号是管制 NGINX 工作状态的模块,信号语法格局为
nginx -s signal
罕用的信号有
stop 疾速关停
quit 失常关停
reload 从新载入配置
reopen 从新关上日志文件
NGINX 的正确关停,是 nginx -s quit
它能够让 NGINX 解决完曾经开始的工作后再退出。
NGINX 配置阐明
基于之前的社区公开课,咱们能够在正式讲 NGINX 配置前先看看它的应用程序治理配置。通过 status 命令找到 NGINX 的 Server 配置文件
> systemctl status nginx
查看 NGINX 的 Server 配置
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
看到 ExecStart
选项,能够确定 NGINX 装置在 /usr/sbin/nginx
,这个配置文件与咱们之前的公开课 Linux 云服务器公开课讲到的常识一唱一和,这里提一下。
查找默认的主配置文件
配置文件局部正式开始
NGINX 有 主配置文件 和辅助配置文件,主配置文件默认名称为 nginx.conf
,默认寄存在 /etc/nginx/nginx.conf
。辅助配置文件的门路受主配置文件管制,具体门路通过主配置文件设置,辅助配置的文件名称和门路都可更改,文件名通常以 conf
结尾。
装置实现后如果你不晓得主配置文件在哪,能够通过默认门路查找,或者通过 find
命令搜寻。
> sudo find / -name nginx.conf
/etc/nginx/nginx.conf
主配置文件根本构造和作用。应用 cat /etc/nginx/nginx.conf
可列出文件内容。如果你不懂,那么能够通过社区之前公布的的公开课 Linux 云服务器公开课学习具体的 Linux 文件查看指令。
user www-data; # 用户
worker_processes auto; 工作过程数
pid /run/nginx.pid; # 过程文件
include /etc/nginx/modules-enabled/*.conf; # 插件模块配置
events {
worker_connections 768; # 容许同时连贯的连接数
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf; # 辅助配置文件门路
include /etc/nginx/sites-enabled/*;
}
# 示例
#mail {
...
#}
这里列出的配置文件我做了适当的调整,删除了被正文的内容,保留了无效内容。重要项的含意都用中文以正文的模式标记在下面了。
看到配置,你必定有点懵,这都是些啥啊。接下来咱们来学习 NGINX 配置文件的根底语法。
NGINX 配置文件根底语法
NGINX 配置文件中的配置项成为 指令 ,指令分为 简略指令 和块指令 。简略的指令由 指令名称 和参数 组成,以空格进行分隔并以 英文分号结尾,例如
worker_processes auto;
其中 worker_processes
是指令,这个指令的作用是设置工作过程数。auto
代表过程数的数量,能够是数字也能够是 auto
(依据 CPU 数量按固定数学公式计算,个别是 CPU+1)。
块指令语法格局与简略指令类似,单以花括号包裹更多的简略指令,例如
http {
server {...}
}
上下文 / 语境
上下文有些中央也称语境,如果 块指令内蕴含其余指令 ,则这个块指令称为 上下文。常见的上下文例如
events
http
server
location
有一个暗藏的上下文指令,main。它不须要显示申明,所有指令的 最外层 就是 main 的范畴。main 作为其余上下文的参考,例如 events 和 http 必须在 main 范畴中;server 必须在 http 中;location 必须在 server 中;以上限定是固定的,不能够随便搁置,否则无奈运行 NGINX 程序,但可能在日志里看到谬误提示信息。
讲了这么多,你肯定乏了,拿咱们来入手吧!
应用 NGINX 为后端程序配置代理
一个简略的 WEB 服务,例如上面这个 flask 利用
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
app.logger.info("receive a request, and response' 穿甲兵技术社区 '")
return {'message': '穿甲兵技术社区', "address": "https://chuanjiabing.com"}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True, host="127.0.0.1", port=6789)
将内容写入到服务器上的某个文件,例如 /home/ubuntu/ke.py
。
启动前记得装置相干的 Python 库 pip3 install flask-restful
在 Ubuntu 20.04 上默认带有新版 Python,环境什么的不必放心。运行这个 Web 后端服务 python3 /home/ubuntu/ke.py
实现后端的启动后,咱们来配置 NGINX
通过后面查看主配置文件可知,辅助配置文件的目录为 /etc/nginx/conf.d
,那么当初咱们在辅助配置文件目录新增配置文件
> sudo vim /etc/nginx/conf.d/ke.conf
server {
listen 8000;
server_name localhost;
location / {proxy_pass http://localhost:6789;}
}
查看配置文件是否正确
> sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从新载入配置
> sudo nginx -s reload
浏览器拜访 http://ip:port
例如我的服务器 http://101.42.137.185:8000/
就能够看到后端的输入了
NGINX 日志文件
默认分为失常日志和外部谬误日志,日志门路可在主配置文件中设置
/var/log/nginx/access.log
/var/log/nginx/error.log
查看失常日志
> cat /var/log/nginx/access.log
117.183.211.177 - - [19/Nov/2021:20:18:46 +0800] "GET / HTTP/1.1" 200 107 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
117.183.211.177 - - [19/Nov/2021:20:18:48 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://101.42.137.185:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
官网文档 - 日志格局 http://nginx.org/en/docs/http…
默认的日志格局
log_format compression '$remote_addr - $remote_user [$time_local]'
'"$request" $status $bytes_sent ''"$http_referer""$http_user_agent" "$gzip_ratio"';
可在主配置文件中自行配置,具体配置项参考官网文档。
应用 NGINX 为前端程序配置代理
一个简略的 HTML 文档
> vim /home/ubuntu/index.html
<html><meta charset="utf-8"/><body><title> 穿甲兵技术社区 </title><div><p> 穿甲兵技术社区 <p><a>https://chuanjiabing.com</a></div><body></html>
无论是大型前端我的项目还是中小型前端我的项目,一般来讲都须要编译为 HTML 文档,而后应用相似 NGINX 这样的利用提供可拜访的服务。
留神:一些 Vue/React 的服务有可能会做服务端渲染部署,但大部分还是编译为 HTML。这里的简略示例和那些前端工程项目在配置上并没有什么区别。作为示例,不必纠结,学习 NGINX 才是要紧的。
> sudo vim /etc/nginx/conf.d/page.conf
server {
listen 1235;
server_name localhost;
charset utf-8;
location / {
root /home/ubuntu/;
index index.html index.htm;
}
}
基于 NGINX 实现负载平衡
设想一下场景,例如当初你服务器上的后端服务次要是用于格式化工夫,有很多爬虫程序须要调用它,而且还须要确保服务稳固可用。
场景延长:假如你逆向了一个 JS 算法,当初所有爬虫都须要在发出请求前调用这个算法生成 sign 值,带着值去申请。如果你把 JS 代码放在 Python/Golang 这类代码里做本地调用执行,那么你改变算法时须要改变 / 重新部署所有爬虫程序,但做成 WEB 服务,只须要改变 / 重启这个 WEB 服务就能够了。
当初 1 个后端服务的状况下有 2 个显著毛病:
1、服务性能不够,申请太多会导致程序卡顿,响应速度慢,影响整体效率;
2、服务整体不稳固,一旦过程退出或者服务器死机,那服务将不可拜访;
应用负载平衡的益处
1、启动多个后端服务,配置负载平衡,让申请按需(例如轮流)转发到它门那里进行解决,那么就可能承当更多的工作需要;
2、一个 NGINX 负载多个后端服务,当一个服务或者几个服务呈现过程退出的状况,还有其余服务在工作;
NGINX 只须要引入 proxy_pass
指令和对应的 upstream
上下文即可实现负载平衡。一个简略的负载平衡配置例如
⚠️ 试验前,请先启动多个后端程序 。能够将方才的 Flask 代码复制到另一个文件(例如 /home/ubuntu/main.py
,但记得须要改变外面的 端口号,倡议改为跟教程一样的 6799),如果你想在网页上看到负载的成果,能够在响应内容处用 6789/6799 来辨别具体是那个后端程序。
# /etc/nginx/conf.d/ke.conf 内容改为
upstream backend{
server localhost:6789;
server localhost:6799;
}
server {
listen 8000;
server_name localhost;
location / {proxy_pass http://backend;}
}
保留后从新载入配置即可
> sudo nginx -s reload
屡次拜访 http://101.42.137.185:8000/
,能够看到页面上显示的内容是 6789 和 6799 这两个后端服务交替返回信息,这阐明负载平衡配置 胜利。
域名解析与配置实际
关上云服务商控制台(后续以腾讯云为例,因为教程录制时应用的是腾讯云轻量级服务器),其余云服务商界面有差别,请大家见风使舵。
在搜寻框处搜寻域名解析(腾讯的的是 DNSPOD)
进入找到要解析的域名(这里的前提是你本人曾经买了域名,做好备案。如果没有,那看我操作也能够),点击解析
点击增加记录
在主机记录处输出子域名名称(例如 ke
)、在记录值处输出服务器 IP 地址后抉择保留即可,其余选项默认。
实现云服务器控制台的设置后,还不能够通过域名拜访到咱们服务器上的利用
返回服务器改变 NGINX 辅助配置文件,更改端口、绑定域名
> sudo vim/etc/nginx/conf.d/ke.conf
# 改变 server 上下文中的 listen 和 server_name
listen 80;
server_name ke.chuanjiabing.com;
记得重载配置
> sudo nginx -s reload
而后就能够通过域名 http://ke.chuanjiabing.com/
拜访服务了
课后作业:在社区课程帖子下晒出后端程序的 NGINX 负载平衡配置截图,3 张。一张是配置截图;另外两张是浏览器拜访时负载配置失效的截图。
后续进阶篇和企业实际篇的课程纲要如下,后续课程的学习目标:可能在工作中很好的利用 NGINX,实现企业级生产环境部署和监控告警
NGINX 进阶篇
NGINX 负载平衡策略实践
编译装置 NGINX
基于 NGINX 实现权限验证
基于 NGINX 实现拜访限流
基于 NGINX 的简略反爬虫
基于 NGINX 实现不停机更新
NGINX 企业级实际篇
NGINX 的 HTTPS 配置实际
NGINX 插件装置
NGINX 数据监控实战
NGINX 生产环境高可用部署实际