Nginx基础-配置代理web服务

1.反向代理及负载均衡
Nginx实现负载均衡用到了proxy_pass代理模块核心配置,将客户端请求代理转发至一组upstream虚拟服务池。

1)upstream配置语法

Syntax: upstream name { ... }
Default: -
Context: http

#upstream示例
upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080 backup;
}
server {
    location / {
        proxy_pass http://backend;
    }
}

2)Nginx负载均衡状态

down 当前的server暂时不参与负载均衡
backup	预留的备份服务器
max_fails	允许请求失败的次数
fail_timeout	经过max_fails失败后, 服务暂停时间
max_conns	限制最大的接收连接数

3)Nginx负载均衡调度策略

轮询	按时间顺序逐一分配到不同的后端服务器(默认)
weight	加权轮询,weight值越大,分配到的访问几率越高
ip_hash	每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash	按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn	最少链接数,那个机器链接数少就分发
hash关键数值	hash自定义的key

2.反向代理参数配置

[root@localhost ~]# vim /etc/nginx/proxy_params
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

#具体location实现
location / {
    proxy_pass http://127.0.0.1:8080;
    include proxy_params;
}

3.Nginx实现四层代理

#Nginx四层代理仅能存在于main段(nginx1.9版本后实现)
stream {
    upstream ssh_proxy {
        hash $remote_addr consistent;
        server 10.0.0.12:22;
	}
}

http {
    upstream mysql_proxy {
        hash $remote_addr consistent;
        server 10.0.0.12:3306;
    }
    
    server {
        listen 20022;
        proxy_connect_timeout 1s;
        proxy_timeout 300s;
        proxy_pass ssh_proxy;
    }
    server {
        listen 23306;
        proxy_connect_timeout 1s;
        proxy_timeout 300s;
        proxy_pass mysql_proxy;
    }
}

4.案例
1)反向代理实现动静分离

upstream static {
    server 10.0.0.12:80;
}

upstream java {
    server 10.0.0.13:8080;
}

server {
    listen 80;
    server_name 127.0.0.1;

    location / {
        root /soft/code;
        index index.html;
    }

    location ~ .*\.(png|jpg|gif)$ {
        proxy_pass http://static;
        include proxy_params;
    }

    location ~ .*\.jsp$ {
        proxy_pass http://java;
        include proxy_params;
    }
}

2)不同客户端显示不同信息

#通过浏览器来分别连接不同的浏览器访问不同的效果。
http {
    upstream firefox {
        server 10.0.0.12:80;
    }
    upstream chrome {
        server 10.0.0.13:80;
    }
    upstream iphone {
        server 10.0.0.14:80;
    }
    upstream android {
        server 10.0.0.15:80;
    }
	upstream default {
        server 10.0.0.11:80;
    }

    #server根据判断来访问不同的页面
    server {
        listen 80;
        server_name 127.0.0.1;

        #safari浏览器访问的效果
        location / {
			#Safari浏览器访问效果
            if ($http_user_agent ~* "Safari"){
                proxy_pass http://dynamic_pools;
            } 
            #firefox浏览器访问效果
            if ($http_user_agent ~* "Firefox"){
                proxy_pass http://static_pools;
            }
            #chrome浏览器访问效果
            if ($http_user_agent ~* "Chrome"){
                proxy_pass http://chrome;
            } 
            #iphone手机访问效果
            if ($http_user_agent ~* "iphone"){
                proxy_pass http://iphone;
            }
            #android手机访问效果
            if ($http_user_agent ~* "android"){
                proxy_pass http://and;
            }

            #其他浏览器访问默认规则
            proxy_pass http://dynamic_pools;
            include proxy.conf;
        }
    }
}

3)访问不同目录代理到不同服务器

http {
	#默认动态,静态直接找设置的static,上传找upload
    upstream static_pools {
        server 10.0.0.12:80 weight=1;
    }
    upstream upload_pools {
        server 10.0.0.13:80 weight=1;
    }
    upstream default_pools {
        server 10.0.0.11:80 weight=1;
    }

	#方案1:location实现。
    server {
        listen 80;
        server_name 127.0.0.1;
        
        location / { 
            proxy_pass http://default_pools;
            include proxy.conf;
        }
        location /static/ {
            proxy_pass http://static_pools;
            include proxy.conf;
        }
        location /upload/ {
            proxy_pass http://upload_pools;
            include proxy.conf;
        }
    }

    #方案2:if语句实现。
    server {
        listen 80;
        server_name 127.0.0.1;
        
        location / { 
            proxy_pass http://default_pools;
            include proxy.conf;
        }
        if ($request_uri ~* "^/static/(.*)$") {
            proxy_pass http://static_pools/$1;
        }
        if ($request_uri ~* "^/upload/(.*)$") {
            proxy_pass http://upload_pools/$1;
        }
	}
}
posted @   wanghongwei-dev  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示