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:当前多少客户端在等待服务器的响应,正在等待的客户端的数量
posted @   立勋  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示