1.Nginx是什么
Nginx是一款轻量级、高性能,并发性好的HTTP和反向代理服务器
2.功能
2.1反向代理
正向代理是指客户端向代理服务器发送请求,代理服务器代表客户端去访问目标服务器。简单来说,正向代理是客户端的代理,客户端通过代理服务器访问外部资源。
-
工作原理:
- 客户端通过配置代理服务器的地址和端口,将请求发送到代理服务器。
- 代理服务器代替客户端发起请求到目标服务器。
- 目标服务器并不知道客户端的真实身份,知道的只是代理服务器的信息。
-
应用场景:
- 访问控制:例如,公司或组织会通过正向代理限制员工访问特定的网站或服务。
- 隐藏客户端 IP 地址:通过正向代理,客户端的 IP 地址被代理服务器的 IP 地址所隐藏。
- 缓存加速:正向代理可以缓存响应内容,减少重复请求,提高访问速度。
反向代理是指客户端的请求发送到代理服务器,代理服务器再将请求转发到内部的真实服务器。简单来说,反向代理是服务器端的代理,客户端不知道真实的服务器地址,只知道代理服务器的地址。
-
工作原理:
- 客户端的请求首先到达代理服务器。
- 代理服务器根据请求内容将请求转发给后端的真实服务器(可以是多个服务器)。
- 后端服务器处理请求并将响应返回给代理服务器。
- 代理服务器将响应返回给客户端。
-
应用场景:
- 负载均衡:Nginx 可以根据不同的负载均衡策略(如轮询、最少连接等)将请求分发到多台后端服务器上,提高服务的可靠性和性能。
- Web 应用的保护:反向代理隐藏了内部应用的真实地址和结构,增强了安全性。
- 缓存:Nginx 可以缓存静态内容和 API 响应,减少后端负载,提高访问速度。
- SSL 终端:Nginx 可以作为 SSL 终端代理,处理所有 SSL/TLS 加密和解密,然后将请求明文转发到后端服务器。
正向代理代理客户端隐藏客户端的地址,反向代理代理服务器隐藏服务器的地址
2.2负载均衡
Nginx通过其内置的upstream
模块来实现负载均衡。该模块允许你定义一组后端服务器,并根据一定的策略将客户端请求转发到这些服务器上。Nginx支持多种负载均衡策略,包括轮询、IP哈希、最少连接数等。
2.2.1 轮询(Round Robin)
轮询是Nginx默认的负载均衡策略。它按照定义的服务器列表顺序逐个分配请求,循环往复。适用于服务器性能相当的情况。
upstream myUpstream {
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myUpstream;
}
}
2.2..2 加权轮询(Weighted Round Robin)
根据服务器的权重值分配请求,权重越高的服务器将获得更多的请求。通过给不同服务器设置不同的权重,可以合理分配负载,更好地利用服务器资源。
upstream myUpstream {
server backend1.example.com weight=3;
server backend2.example.com weight=1;
}
server {
location / {
proxy_pass http://myUpstream;
}
}
2.2..3 IP哈希(IP Hash)
根据客户端的IP地址进行哈希计算,将相同IP的请求始终分发到同一台后端服务器上。这样可以保证来自同一客户端的请求都会被发送到同一服务器,适用于需要会话保持或缓存一致性的应用场景。
upstream myUpstream {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myUpstream;
}
}
2.2..4 最少连接(Least Connections)
该策略将请求发送给当前连接数最少的服务器。通过动态地追踪每个服务器的连接数,将请求分发给连接最少的服务器,以实现负载均衡。适用于处理连接时长不一致的场景,如长连接和短连接混合的情况。
upstream myUpstream {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myUpstream;
}
}
2.2.5 加权最少连接(Weighted Least Connections)
为每台服务器分配权重,并按照最少连接数进行负载均衡
upstream myUpstream {
least_conn;
server backend1.example.com weight=3;
server backend2.example.com weight=1;
}
server {
location / {
proxy_pass http://myUpstream;
}
}
2.3动静分离
Nginx动静分离,简单来说,就是动态请求和静态请求分开,也可以理解成使用Nginx处理静态页面,Tomcat 处理动态页面,动静分离从目前实现角度来讲大致分为两种。
纯粹把静态文件独立成单独的域名,放在独立的服务器上(主流推崇的方案)
动态跟静态文件混合在一起发布,通过Nginx来分开
通过location指定不同的后缀名实现不同的请求转发,也可以通过expires参数设置,使浏览器缓存文件的过期时间,从而减少与服务器之前的请求和流量。(有更新则拉取,没更新则直接拿客户端的缓存)
Expires具体含义:给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量,也就是所谓的客户端缓存。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),假设一下,把这个Expires设置3d,表示在3天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
2.3.1 动静分离目的
为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,来加快解析速度,提高请求的访问效率,降低原来单个服务器的压力,下面是动静分离的原理图。
3、nginx配置文件nginx.conf组成
1、全局块(Global Block):全局块包含了对整个 Nginx 服务器的全局配置,比如运行 Nginx 的用户、Nginx 的工作进程数、错误日志文件路径等。
#user nobody;
worker_processes 1; ###值越大,支持的并发数越大
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
2、events 块:该块用于配置与网络连接有关的参数,比如最大连接数、每个 worker 进程的最大连接数等。
events {
worker_connections 1024; ###nginx支持的最大连接数
}
3、http 块:http 块包含了针对 HTTP 协议的配置信息,比如 MIME 类型、日志格式、默认的字符编码等。
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
}
4、server 块:server 块定义了一个虚拟主机的配置,包括监听的端口、域名、SSL 配置等。
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
5、location 块:location 块用于匹配请求的 URL,并定义了针对这些 URL 的特定处理方式,比如反向代理、重定向、静态文件服务等。示例:
location /images/ {
root /data;
}