本文正在参与 “性能优化实战记录-NGINX专属赛道”话题征文活动
今年5月,NGINX 创下了一个重要的里程碑——W3Techs 宣布, NGINX的市场份额现已超越 Apache HTTP Server 成为全球最常用的 Web 服务器。 除了作为Web服务器以外,NGINX在近 20 年的发展历程中还拓展了许多其他功能,包括反向代理、负载均衡、流量整形、高速缓存和安全控制等,这些功能都广受大家的欢迎。
1. 简介
前段时间面试被问到了有没有了解过
Nginx
,之前只听说过确实没有了解过,听搞后端的室友说挺简单的,那YK菌今天就来学一学吧~
什么是Nginx
Nginx
(Engine X
)是一个高性能的 HTTP
和 反向代理
服务器,特点是占有内存少,并发能力强
Nginx
的并发能力是同类型的网页服务器中表现较好
Nginx
专为性能优化而开发,性能是其重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明其能支持高达50000个并发连接
反向代理、负载均衡、动静分离是
Nginx
中最基本的概念,今天我们先来学习学习这些概念,然后在Linux中安装一下Nginx
,算是对Nginx
的一个最基础的入门
正向代理
在介绍反向代理之前,我们首先来介绍一下什么是正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理
客户端对代理是无感知的,因为客户端不需要任何配置就可以访问
只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。
集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2. 安装
在Linux系统下安装,我是用的是Windows下的Linux子系统,然后在应用商店装的Ubuntu20.04
运行安装命令
sudo apt-get install nginx
等待一段时间之后就可以
开启 Nginx
服务器
service nginx start
浏览器打开
切换到root身份
查看 Nginx
进程
ps -ef | grep nginx
关闭进程
nginx -s stop
启动 Nginx
nginx
重加载 Nginx
nginx -s reload
3. Nginx
配置文件
查看 Nginx
的位置
whereis nginx
可以查看到配置文件的位置
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;
}
常用的设置包括
- 是否开启对多
work process
下的网络连接进行序列化 - 是否允许同时接收多个网络连接
- 选取哪种事件驱动模型来处理连接请求
- 每个
word process
可以同时支持的最大连接数等
上述例子就表示每个 work process
支持的最大连接数为 768.
这部分的配置对 Nginx
的性能影响较大,在实际中应该灵活配置。
第三部分:http
块
这算是 Nginx
服务器配置中最频繁的部分,【代理】、【缓存】和【日志定义】等绝大多数功能和第三方模块的配置都在这里。
- 需要注意的是:
http
块也可以包括http
全局块、server
块
① http
全局块
http
全局块配置的指令包括文件引入、MIME-TYPE
定义、日志自定义、连接超时时间、单链接请求数上限等
② server
块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http
块可以包括多个 server
块,而每个 server
块就相当于一个虚拟主机。
而每个 server
块也分为全局 server
块,以及可以同时包含多个 locaton
块。
- 全局
server
块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或
IP
配置。
location
块
一个
server
块可以配置多个location
块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string
),对虚拟主机名称(也可以是 IP
别名)之外的字符串(例如 前面的 /uri-string
)进行匹配,对特定的请求进行处理。
地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。