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;
}
}
}
作者:wanghongwei
版权声明:本作品遵循<CC BY-NC-ND 4.0>版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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吗?