Nginx 是一个高性能的 HTTP 和反向代理 web 服务器。它的配置非常简单,下面是我整理的 Nginx 知识点。
在阅读本文之前,建议先查看文章目录,然后再深入阅读,这样能快速形成对 Nginx 的认识。对于非复杂性的配置,以下内容足以满足日常工作需求,并可应对面试要求。
一、代理:
代理分为被代理角色和目标角色。
1、正向代理:
- 客户端非常明确要访问的服务器地址;
- 服务器只知道请求来自哪个服务器(不知道哪个客户端);
- 正向代理屏蔽或者隐藏了真实客户端。
例如:当我们无法直接访问国外网站时,我们需要通过代理服务器(FQ)来访问,通过代理服务器去访问我们指定的网址。
2、反向代理:
- 多个客户端向反向代理服务器发送请求,Nginx 根据一定的规则将请求分发到不同的服务器;
- 客户端不清楚请求将被分发到哪台服务器,反向代理隐藏了服务器的信息。
总结:正向代理代理客户端的请求去访问目标服务器,目标服务器可能是一个反向服务器,反向代理了多台真实的服务器。
二、负载均衡
总说负载均衡,负载均衡是做什么用的?什么场景使用?
核心定义
负载均衡是用来分配客户端请求到多个服务器的机制,常用于解决高负载和提高系统可用性的问题。
- 负载量:客户端发送的请求数量,也是负载量。
- 均衡规则:反向代理服务器根据一定的规则将请求分发到不同的服务器上处理。
- 负载均衡可分为硬件负载均衡(成本较高)和软件负载均衡(成本较低)。
- 软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx支持的复杂均衡调度算法
weight 轮询(默认):按顺序将请求逐一分配到不同的服务器上,支持设置权重值来调整不同服务器上请求的分配率。
若在使用过程中某一服务器宕机,nginx会自动将该服务器剔除队列,请求代理不受任何影响。
特点:可以设置权重值(weight),用于调整不同的服务器上请求的分配率,权重越大,被分配到请求的几率越大(依据硬件配置调整)。
- ip_hash:根据客户端请求的 IP 的哈希值进行匹配,将具有相同 IP 哈希的客户端分配到指定的服务器。
- fair:动态根据服务器对请求的处理和响应完成时间进行均衡匹配,响应完成时间短且处理效率高的服务器分配请求的概率较高。
- 该方法虽然结合了前两者的优点,但是nginx不支持fair算法,需要安装upstream_fair模块。
- url_hash:根据访问的 URL 的哈希结果分配请求,每个请求的 URL 将分配到指定的服务器。可以提高缓存效率,但需要安装 nginx 的 hash 软件包。
三、nginx配置
Nginx 通过配置 .conf
文件进行运行。
1、核心配置
核心功能包含反向代理、负载均衡和静态服务器3种。
- main:全局信息配置。
- events:工作模式配置。
- http:HTTP 通信信息配置。
- server:服务端访问信息配置。
- location:访问路由配置。
- upstream:负载均衡配置
2、配置文件
/usr/local/nginx/conf/vhost/admin.conf
尝试从上面nginx配置文件地址读取后内容如下:
server {
listen 80; # 服务端口号
client_max_body_size 100m; # body请求数据大小
index index.html; # 项目地址
root /user/project/admin; # 项目根目录地址
# 路由配置
location ~ /* {
proxy_pass http://127.0.0.1:3001; # 代理服务地址
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location ~ .*\.(gif|jpg|jpeg|png|swf)$ {
expires 1d;
}
location ~ .*\.(js|css)?$ {
expires 24h;
}
location ~ /.well-known {
allow all;
}
location ~ /\. {
deny all;
}
access_log /user/logs/admin.log; # 记录日志
}
配置详情如下:
server
:定义一个虚拟主机的配置块,一个 HTTP 中可以配置多个 server。listen 80
:设置服务端监听的端口号为 80。client_max_body_size 100m
:设置请求中允许的最大 body 大小为 100 MB。index index.html
:设置项目地址的默认文件为 index.html。root /user/project/admin
:指定项目根目录的路径。location /
:配置请求路径为/
的 location 块。proxy_pass http://127.0.0.1:3001
:将请求代理到地址的后端服务器。proxy_redirect off
:关闭代理重定向。proxy_set_header
:设置代理请求头。proxy_next_upstream
:定义当后端服务器返回错误时,Nginx 将如何处理请求。proxy_max_temp_file_size
:设置允许的最大临时文件大小。proxy_connect_timeout
、proxy_send_timeout
、proxy_read_timeout
:定义代理连接、发送和读取超时时间。proxy_buffer_size
、proxy_buffers
、proxy_busy_buffers_size
:设置代理缓冲区的大小。proxy_temp_file_write_size
:设置代理临时文件的写入大小。
location ~ .*.(gif|jpg|jpeg|png|swf)$
:配置请求以.gif
、.jpg
、.jpeg
、.png
或.swf
结尾的文件的 location 块。expires 1d
:设置这些文件的过期时间为 1 天。
location ~ .*.(js|css)?$
:配置请求以.js
或.css
结尾的文件的 location 块。expires 24h
:设置这些文件的过期时间为 24 小时。
location ~ /.well-known
:配置请求以/.well-known
开头的路径的 location 块。allow all
:允许所有请求访问该路径。
location ~ /.
:配置以.
开头的路径的 location 块。deny all
:禁止所有请求访问该路径。
access_log /user/logs/admin.log
:指定记录日志的路径为/user/logs/admin.log
。
3、其他配置
除了以上的配置外,nginx还能配置以下配置:
- server:配置虚拟主机,一个 HTTP 中可以配置多个 server。
- server_name:指定 IP 地址或域名,多个配置之间用空格分隔。
- root:主机内的根目录,用于指定当前主机中 web 项目的根目录。
- index:访问 web 网站时的全局首页。
- charset:设置网页的默认编码格式。
- access_log:指定该虚拟主机服务器中的访问记录日志存放路径。
- error_log:指定该虚拟主机服务器中访问错误日志的存放路径。