Nginx03-虚拟主机、反向代理、负载均衡
虚拟主机
配置虚拟主机
当配置虚拟主机数量较多时,可以将部分配置移至子配置文件中。
在主配置文件中维护子配置文件的路径,子配置文件中直接写server块,一个server写一个虚拟主机的配置文件
vim /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf.d/*.conf
基于域名的虚拟主机
vim /usr/local/nginx/conf.d/host1.conf
server {
listen 80;
server_name bbs.abc.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name blog.abc.com;
location / {
root html/blog;
index index.html index.htm;
}
}
基于端口的虚拟主机
server {
listen 8080; // 端口
server_name web1.example.com; // 域名
......
}
server {
listen 8000; // 端口不一致
server_name web1.example.com; // 域名一致
.......
}
基于IP的虚拟主机
server {
listen 192.168.0.1:80; // IP地址与端口
server_name web1.example.com; // 域名
......
}
server {
listen 192.168.0.2:80; // IP地址与端口
server_name web1.example.com;
......
}
设置目录列表
默认情况下,nginx是不允许列出站点的目录列表的,这个功能类似FTP
autoindex on; # 开启目录列表功能
autoindex_exact_size off; # 以KB/MG/GB显示文件大小
autoindex_locatime on; # 显示文件服务器的时间
反向代理
vim /usr/local/nginx/conf.d/host1.conf
server {
listen 80;
server_name bbs.abc.com;
# 域名bbs.abc.com的请求会被转发到https://192.168.2.5
location / {
proxy_pass https://192.168.2.5;
}
}
反向代理相关配置
proxy_pass #指定请求的代理目标地址。
location / {
proxy_pass http://backend_server;
}
proxy_set_header #设置发送到上游服务器的请求头。可以用来添加、修改或删除请求头。
location / {
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_redirect #修改上游服务器返回的重定向响应头中的 Location 和 Refresh 头
location / {
proxy_pass http://backend_server;
proxy_redirect http://backend_server/ /;
}
proxy_connect_timeout #设置与上游服务器建立连接的超时时间
location / {
proxy_pass http://backend_server;
proxy_connect_timeout 60s;
}
proxy_read_timeout #设置从上游服务器读取响应的超时时间
location / {
proxy_pass http://backend_server;
proxy_read_timeout 60s;
}
proxy_send_timeout #设置发送请求到上游服务器的超时时间
location / {
proxy_pass http://backend_server;
proxy_send_timeout 60s;
}
proxy_buffer_size #设置用于读取上游服务器响应的缓冲区大小
location / {
proxy_pass http://backend_server;
proxy_buffer_size 4k;
}
proxy_buffers #设置用于存储上游服务器响应的缓冲区数量和大小
location / {
proxy_pass http://backend_server;
proxy_buffers 16 4k;
}
proxy_busy_buffers_size #设置繁忙代理缓冲区的大小,用于处理大文件传输时的性能优化。
location / {
proxy_pass http://backend_server;
proxy_busy_buffers_size 8k;
}
proxy_temp_file_write_size #设置写入临时文件的大小。
location / {
proxy_pass http://backend_server;
proxy_temp_file_write_size 8k;
}
proxy_cache #启用对代理请求的缓存。
location / {
proxy_pass http://backend_server;
proxy_cache my_cache;
}
proxy_cache_valid #设置缓存响应的有效时间。
location / {
proxy_pass http://backend_server;
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid any 1m;
}
proxy_cache_key #定义缓存键,用于唯一标识缓存条目。
location / {
proxy_pass http://backend_server;
proxy_cache_key $host$uri$is_args$args;
}
proxy_cache_path #定义缓存存储路径和缓存参数。
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
}
负载均衡
负载均衡方式
轮询:默认的方式,按请求时间顺序分配请求,服务器宕机会自动剔除
权重:利用weight指定轮询比重,越大访问率越高
ip_hash:每个请求按访问IP的hash结果分配,这样可以使每个访客固定访问一个后端服务器,可以解决Session 共享的问题
第三方模块:第三方模块采用fair时,按照每台服务器的响应时间来分配请求,响应时间短的优先分配;若第三方模块采用urlhash时,按照访问url的hash值来分配请求。
upstream定义在server字段之外httpd字段之内
轮询方式
upstream webserver {
server 192.168.2.100 ;
server 192.168.2.200 ;
server 192.168.2.101 ;
}
加权轮询方式
upstream webserver {
server 192.168.2.100 weight=1 max_fails=1 fail_timeout=30;
server 192.168.2.200 weight=2 max_fails=2 fail_timeout=30;
server 192.168.2.101 down;
}
# weight 设置服务器权重值,默认值1
# max_fails 允许请求失败次数,默认是1
# fail_timeout 经历max_fails次失败后,暂停服务的时间,单位为秒
# down 标记服务器已关机,不参与集群调度
max_fails和fail_timeout 由自带模块 ngx_http_upstream_module提供
ip_hash方式
upstream webserver {
ip_hash; // ip_hash配置
server 192.168.2.100 weight=1 max_fails=1 fail_timeout=30;
server 192.168.2.200 weight=2 max_fails=2 fail_timeout=30;
server 192.168.2.101 down;
}
第三方模块方式
使用fair模块
nginx需要安装第三方模块才能实现对应的负载均衡功能
unzip nginx-upstream-fair-master.zip
mv nginx-upstream-fair-master nginx-upstream-fair
./configure --add-moudule=/path/to/nginx-upstream-fair
make && make install
upstream webserver {
server 192.168.2.100 ;
server 192.168.2.200 ;
fair;
}
root和location的使用情景
单独使用 root
root 指令用于指定服务器根目录的路径,它可以在 http 块、server 块或 location 块中使用。
通常用来定义静态文件的基础路径。
示例:在 http 或 server 块中使用 root,定义全局或特定虚拟主机的根目录。
http {
root /var/www/html; # 全局根目录
}
server {
root /var/www/site; # 特定虚拟主机的根目录
}
单独使用 location
location 指令用于匹配请求的 URI 并对其进行处理。
你可以在 location 块中定义不同的处理逻辑,如代理、重写 URL、静态文件的处理等。
示例:location 块用于根据请求 URI 来定义特定的处理规则。
server {
location /images/ {
# 处理所有以 /images/ 开头的请求
}
location /videos/ {
# 处理所有以 /videos/ 开头的请求
}
}
在 location 中使用 root
在 location 块中使用 root 指令,可以覆盖全局或 server 级别的 root 指令,为特定的 URI 前缀定义根目录。
示例:在 location 块中使用 root,用于为特定路径定义不同的根目录。
server {
root /var/www/site; # 默认根目录
location /images/ {
root /var/www/images; # 覆盖默认根目录,为 /images/ 路径指定新的根目录
}
location /videos/ {
root /var/www/videos; # 覆盖默认根目录,为 /videos/ 路径指定新的根目录
}
}
总结
全局或虚拟主机级别使用 root:在 http 或 server 块中定义站点的默认根目录。
http {
root /var/www/html;
}
server {
root /var/www/site;
}
使用 location:根据请求 URI 定义特定的处理规则。
server {
location /images/ {
# 处理 /images/ 请求
}
location /videos/ {
# 处理 /videos/ 请求
}
}
在 location 中使用 root:为特定路径定义新的根目录。
server {
root /var/www/site;
location /images/ {
root /var/www/images; # /images/ 请求从 /var/www/images 目录读取
}
location /videos/ {
root /var/www/videos; # /videos/ 请求从 /var/www/videos 目录读取
}
}
nginx自身健康检查
查看服务器状态信息
编译安装时使用--with-http_stub_status_module,开启状态页面模块
修改Nginx配置文件,定义状态页面
vim /usr/local/nginx/conf/nginx.conf
location /status { # 表示 http://IP/status
stub_status;
}
查看状态页面信息
http://192.168.4.5/status
Active connections: 1
server accepts handled requests #历史记录,不是显示当前的数量,想要重置,关闭服务再重起,
10 10 3
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量,实时的并发连接数,2表示当前有两个人在同时连你
Accepts:已经接受客户端的连接总数量,与tcp握手有关(三次握手、四次断开),tcp的连接数有多少次
Handled:已经处理客户端的连接总数量,处理了几个tcp请求,客户端的点击量,涨工资的数据
(一般与accepts一致,除非服务器限制了连接数量,当服务器被攻击时,可以作限制)
Requests:客户端发送的请求数量一次连接,多次请求,客户端请求了多少次
Reading:当前服务器正在读取客户端请求的数量,正在读取客户端的请求
Writing:当前服务器正在写响应信息的数量,给客户端作出回应
Waiting:当前多少客户端在等待服务器的响应,正在等待的客户端的数量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)