Nginx的正向与反向代理

一、Nginx简介

1. 什么是Nginx

Nginx(发音为"engine-x")是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。Nginx是由俄罗斯的Igor Sysoev(伊戈尔·赛索耶夫)为解决C10k问题(即同时处理超过10000个客户端连接)而开发的。它以高性能、稳定性、功能丰富和低资源消耗而闻名。它第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。

2. Nginx优点

1)高性能 :Nginx能够处理大量的并发连接,且内存消耗相对较低。

2)高稳定性 :Nginx以其稳定性而著称,极少出现崩溃的情况。

3)模块化 :Nginx支持模块化设计,可以根据需要加载或卸载特定的模块。

4)配置简单 :Nginx的配置文件简洁明了,易于理解和维护。

5)跨平台:Nginx可以在多种操作系统上运行,包括Linux、BSD、Mac OS和Windows。

二、正向代理

正向代理 (代理客户端),例子:VPN、游戏加速器、公司网络

正向代理通常用于客户端,在客户端配置代理服务器进行指定网站访问,由代理服务器转发请求,返回给客户端,比如国内无法访问谷歌,这个时候我们就可以设置正向代理来访问

正向代理主要作用

1)访问控制 :代理服务器可以控制客户端可以访问哪些网站或服务。

2) 缓存 :代理服务器可以缓存请求的结果,提高访问速度。

3)隐私保护 :代理服务器可以隐藏客户端的真实IP地址,提供一定程度的匿名性。

4)过滤:代理服务器可以过滤请求和响应,例如屏蔽广告或不适当的内容。

Nginx在正向代理中的配置示例:

sql 复制代码
...
server {
    resolver 8.8.8.8;#指定DNS服务器IP地址
    listen 80;#监听80端口
    server_name localhost;
    # 正向代理转发http请求
    location / {
        proxy_pass http://$http_host$request_uri;
        proxy_set_header HOST $host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k;
        proxy_send_timeout 30;
        proxy_read_timeout 60;
    }
}
...

注意:nginx官方并不支持直接转发https请求,nginx支持https需要ngx_http_proxy_connect_module模块

三、反向代理

反向代理 (代理服务端),例子:访问百度网址

反向代理是服务端,客户端不需要知道目标服务器的地址,反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址

反向代理的主要作用

1)负载均衡 :反向代理可以将请求通过负载均衡算法分发到多个后端服务器,平衡负载。

2)缓存 :反向代理可以缓存静态内容,减轻后端服务器的负担。

3)SSL加密 :反向代理可以管理SSL/TLS加密和证书,简化后端服务器的配置。

4)压缩 :反向代理可以对响应进行压缩,提高传输效率。

5)安全:反向代理可以作为额外的安全层,隐藏目标服务器的身份,从而保证内网安全。

Nginx在反向代理中的应用配置示例:

sql 复制代码
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://127.0.0.1:8080;
            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_pass http://127.0.0.1:8080; 将所有请求转发到本地的8080端口。

proxy_set_header 指令用于确保后端服务器收到正确的客户端请求信息。

附:Nginx配置文件说明

nginx的配置文件结构如下:

sql 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

通常包含以下几部分:

sql 复制代码
全局块        
├── events  
├── http    
│   ├── upstream 
│   ├── server   
│   ├── server
│   │   ├── location 
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

全局块:

全局配置,影响nginx的整体行为,例如定义运行nginx进程的用户(组)、允许打开的文件数、日志文件位置等。比如:

sql 复制代码
# 全局块
user  nginx;
# Nginx 进程的数量
worker_processes  1;

# 定义 PID 文件位置
pid        /var/run/nginx.pid;

# 定义错误日志文件位置
error_log  /var/log/nginx/error.log warn;
# 定义访问日志文件位置
access_log  /var/log/nginx/access.log  main;

events块:

配置与客户端连接的相关参数,如工作连接数、事件处理机制等。

sql 复制代码
# events 块
events {
    worker_connections  1024;
}

http块:

定义了所有http服务器的配置指令,包括文件引用、日志定义、http头部信息、MIME-TYPE定义、SSL配置、客户端请求头处理等。

sql 复制代码
# http 块
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 定义日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 定义访问日志
    access_log  /var/log/nginx/access.log  main;

    # 定义 sendfile
    sendfile        on;
    # 定义 keepalive 超时时间
    keepalive_timeout  65;

    # 包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    # server 块
    server {
        listen       80;
        server_name  localhost;

        # 定义 location 块
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        # 定义 error_page
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # 定义 upstream 块
        upstream backend {
            server backend1.example.com;
            server backend2.example.com;
        }

        # 定义 map 块
        map $http_host $backend_pool {
            backend1.example.com backend1;
            backend2.example.com backend2;
            default              backend1;
        }

        # 使用 upstream
        location /backend {
            proxy_pass http://$backend_pool;
        }
    }
}

server块:

http 块可以包含多个 server 块,每个 server 块定义了一个虚拟主机。server块定义了服务器级别的配置指令,可以有多个server块,每个块定义了一个虚拟主机。server块可以继承http块的配置。server 块中的配置对特定的虚拟主机有效。server 块可以包含多个 location 块。

location块:

定义了请求的路由和处理方式,用于匹配请求的URI,并定义如何处理匹配的请求

upsteam块:

定义了一组后端服务器,用于负载均衡。upstream块中的配置对特定后端服务器有效。

map块:

可以基于某些请求设置变量的值,map块中的配置对整个nginx服务有效。

include指令:

用于包含其他配置文件。include指令可以出现在全局块、http块或server块中,用于引入其他配置文件。

相关推荐
xujiangyan_8 小时前
nginx的反向代理和负载均衡
服务器·网络·nginx
viqecel1 天前
网站改版html页面 NGINX 借用伪静态和PHP脚本 实现301重定向跳转
nginx·php·nginx重定向·301重定向·html页面重定向
硪就是硪1 天前
内网环境将nginx的http改完https访问
nginx·http·https
ak啊1 天前
Nginx 安全加固详细配置指南
nginx
沐土Arvin2 天前
Nginx 核心配置详解与性能优化最佳实践
运维·开发语言·前端·nginx·性能优化
haoranyyy2 天前
mac环境中Nginx安装使用 反向代理
linux·服务器·nginx
ak啊2 天前
Nginx 高级缓存配置与优化
nginx
再学一丢丢2 天前
Keepalived+LVS+nginx高可用架构
nginx·架构·lvs
xujiangyan_2 天前
nginx的自动跳转https
服务器·nginx·https
tingting01193 天前
k8s 1.30 安装ingress-nginx
nginx·容器·kubernetes