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

相关推荐
Knight_AL38 分钟前
Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
nginx·docker·容器
虹梦未来3 小时前
【运维心得】Ubuntu2404编译nginx隐藏Server信息
运维·服务器·nginx
tgethe6 小时前
Nginx笔记
运维·笔记·nginx
invicinble7 小时前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug7 小时前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart8 小时前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang8 小时前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛8 小时前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx
苹果醋39 小时前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx
丁丁丁梦涛9 小时前
nginx在多层服务器代理接口地址的应用
运维·服务器·nginx