nginx 基础知识和原理

nginx 基础知识和原理

nginx 配置反向代理、负载均衡、动静分离、集群搭建

nginx 简介

什么是 nginx

nginx(“engine x”)是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好

nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数

反向代理

  • 正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问

  • 反向代理:
    反向代理,其实就是客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分法到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

动静分离

  • 静态资源:Html、CSS、JavaScript
  • 动态资源: razor、blazor、jsp、servlet

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

kestrel、tomcat 部署动态资源,静态资源服务器部署静态资源

安装 nginx

相关的依赖:

  • pcre
  • openssl
  • zlib
  • nginx

过程省略

编译安装成功之后,在 nginx 安装目录下的 sbin 有启动脚本
启动nginx:进入 nginx/sbin 目录,执行./nginx就可以启动 nginx
启动之后可以通过浏览器访问 ip,nginx 默认 80 端口,但是 Linux 的防火墙默认是不开放的

  • 查看开放的端口:firewall-cmd --list-all
  • 设置开放的端口号:
firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
  • 重启防火墙:firewall-cmd --reload

使用 apt 安装的话,service nginx start就可以启动

nginx 常用命令

使用 nginx 操作命令的前提:进入 nginx 安装目录,apt 安装的进入 usr/sbin 目录使用

  • 查看 nginx 版本号
./nginx -v
  • 启动 nginx
./nginx
  • 关闭 nginx
./nginx -s stop
  • 重新加载 nginx
./nginx -s reload

nginx 配置文件

nginx.conf
nginx 配置文件位置就在 nginx/conf 目录下,apt安装的在 etc/nginx 目录下

分为三个部分:

第一部分:全局块

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令
主要包括配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型,以及配置文件的引入等

worker_processes 1;:这是 nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

第二部分:events 块

events {
	worker_connections 768;
	# multi_accept on;
}

events 块涉及的指令主要影响 nginx 服务器与用户的网络连接
常用的设置包括是否开启对 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等
这部分的配置对 nginx 的性能影响较大,在实际中应该灵活配置

worker_connections 1024;:表示每个 work process 支持的最大连接数为 1024

第三部分:http 块

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

这算是 nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里

需要注意的是:http 块也可以包括 http 全局块、server 块
根据配置文件,应该就在以下目录里

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志定义、连接超时时间、单链接请求数上限等

server 块

server 块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本

每个 http 块可以包含多个 server 块,而每个 server 块就相当于一个虚拟主机

而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块

全局 server 块

最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置

location 块

一个 server 块可以配置多个 location 块

这块的主要作用是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向
数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行

nginx 原理

master & worker

worker 如何进行工作

一个 master 和多个 worker 的好处

  • 可以使用 nginx -s reload 热部署,只有争抢到 client 的 worker 不会重新加载 nginx,利于 nginx 进行热部署操作
  • 每一个 worker 都是独立的进程,不需要加锁。一个 worker 出现异常,不会影响别的 worker,保证服务不会中断

设置多少个 worker 合适

nginx 与 redis 类似,都采用了 io 多路复用机制,Windows 的 nginx 没有这个
每个 worker 的线程都可以把一个 cpu 的性能发挥到极致,所以 worker 的数量与服务器的cpu数量相等是最为合适的。
设置少了会浪费cpu,设置多了会造成cpu频繁切换上下文带来损耗

设置 worker 数量

worker_process 4

# worker 绑定 cpu(4 worker 绑定 4 cpu)
worker_cpu_affinity 0001 010 0100 1000

# worker 绑定 cpu(4 work 绑定 8 cpu 中的 4 个)
worker_cpu_affinity 00000001 00000010 00000100 000010000

worker 连接数 worker_connection

发送一个请求,占用了 worker 的几个连接数?

2个 或者 4个
访问静态资源需要 2个
访问动态资源需要 4个

假设,nginx 有一个 master,有四个 worker,每个 worker 支持最大的连接数据是 1024,支持的最大并发数是多少

worker 最大支持的连接数 = 4 * 1024

访问静态资源的最大并发数 = (4 * 1024)/2
访问动态资源的最大并发数 = (4 * 1024)/4

nginx 基础知识和原理 结束

posted @ 2021-09-20 16:09  .NET好耶  阅读(214)  评论(0编辑  收藏  举报