乐趣区

关于nginx:NGINX-入门到企业级应用实践基础篇

这是一系列 收费 的常识,有 图文版 视频版,你当初看到的是图文版。

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 生产环境高可用部署实际

退出移动版