【Nginx】前端也要会的Nginx基础知识 🚀 - 反向代理 - 负载均衡 - 动静分离

1,671 阅读6分钟

本文正在参与 “性能优化实战记录-NGINX专属赛道”话题征文活动

今年5月,NGINX 创下了一个重要的里程碑——W3Techs 宣布, NGINX的市场份额现已超越 Apache HTTP Server 成为全球最常用的 Web 服务器。 除了作为Web服务器以外,NGINX在近 20 年的发展历程中还拓展了许多其他功能,包括反向代理负载均衡流量整形高速缓存安全控制等,这些功能都广受大家的欢迎。

1. 简介

前段时间面试被问到了有没有了解过Nginx,之前只听说过确实没有了解过,听搞后端的室友说挺简单的,那YK菌今天就来学一学吧~

什么是Nginx

NginxEngine X)是一个高性能的 HTTP反向代理 服务器,特点是占有内存少,并发能力强

Nginx 的并发能力是同类型的网页服务器中表现较好

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

反向代理、负载均衡、动静分离是 Nginx 中最基本的概念,今天我们先来学习学习这些概念,然后在Linux中安装一下 Nginx ,算是对 Nginx 的一个最基础的入门

正向代理

在介绍反向代理之前,我们首先来介绍一下什么是正向代理

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

在这里插入图片描述

反向代理

客户端对代理是无感知的,因为客户端不需要任何配置就可以访问

只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址

在这里插入图片描述

负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。

在这里插入图片描述

随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。

在这里插入图片描述

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

在这里插入图片描述

动静分离

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

在这里插入图片描述

2. 安装

在Linux系统下安装,我是用的是Windows下的Linux子系统,然后在应用商店装的Ubuntu20.04

image.png

运行安装命令

sudo apt-get install nginx

等待一段时间之后就可以

image.png

开启 Nginx 服务器

service nginx start

浏览器打开

在这里插入图片描述

切换到root身份

在这里插入图片描述

查看 Nginx 进程

ps -ef | grep nginx

在这里插入图片描述

关闭进程

nginx -s stop

在这里插入图片描述

启动 Nginx

nginx

在这里插入图片描述

重加载 Nginx

nginx -s reload

3. Nginx 配置文件

查看 Nginx 的位置

whereis nginx

image.png

可以查看到配置文件的位置

在这里插入图片描述

在这里插入图片描述

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

events {
	worker_connections 768;
	# multi_accept on;
}

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; # 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/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分

第一部分:全局块

全局块:配置服务器整体运行的配置指令(主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等)

worker_processes auto;
  • 处理并发的数量

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

第二部分:events

影响 Nginx 服务器与用户的网络连接

events {
	worker_connections 768;
	# multi_accept on;
}

常用的设置包括

  1. 是否开启对多 work process 下的网络连接进行序列化
  2. 是否允许同时接收多个网络连接
  3. 选取哪种事件驱动模型来处理连接请求
  4. 每个 word process 可以同时支持的最大连接数等

上述例子就表示每个 work process 支持的最大连接数为 768.

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http

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

  • 需要注意的是:http 块也可以包括 http 全局块、server

http 全局块

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

server

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

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

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

  1. 全局 server

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

  1. location

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

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string ),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string )进行匹配,对特定的请求进行处理。

地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。