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块中,用于引入其他配置文件。

相关推荐
xixingzhe29 小时前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx
北风toto12 小时前
Windows 下用 OpenSSL 生成 SSL 密钥并配置 Nginx 教程
windows·nginx·ssl
卜锦元14 小时前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT16 小时前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
Coisinier1 天前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
2301_32241428041 天前
基于web的校园失物招领管理系统59695-计算机毕设 原创(免费领源码+部署教程+开发环境)
mysql·nginx·php·apache·thinkphp·phpstudy·wampserver
flytalei2 天前
从YAML到Nginx服务访问:动手理解 Kubernetes Pod、Deployment 与 Service
运维·nginx·kubernetes
健康活着就好2 天前
# Nginx负载均衡四种策略,从原理到配置
nginx
Vitaliy Kostrov(柯维远)3 天前
谁来承担额外工作?CDN 参与者如何协商资源
nginx·缓存·系统架构·开源·cdn