史上最简单Nginx入门

一、Nginx简介

1、nginx是什么?

Nginx是一款轻量级的高性能HTTP和反向代理web服务器,也可以作为电子邮件(IMAP/POP3)代理服务器和通用的TCP/UDP代理服务器。它最初由Igor Sysoev设计和开发,于2004年首次公开发布。Nginx是一个开源软件,以BSD许可证发布,因此它是免费的,并且可以在Windows、Linux、Mac OS X、Unix等多种操作系统上运行。

Nginx的主要优点是高性能、高并发、低内存消耗和稳定性,被广泛用于高流量的网站、视频流媒体、CDN、反向代理、负载均衡等场景。它的设计理念是模块化、可扩展、灵活,可以通过添加模块来扩展其功能,也可以通过自定义模块来实现特定的需求。Nginx还支持动态模块加载,因此可以在运行时添加和删除模块,而无需重新编译和安装Nginx。支持高达50,000个并发连接数的响应。

总之,Nginx是一款功能强大的高性能web服务器和反向代理服务器,被众多企业和网站所采用。

2、nginx具有哪些功能

  • 静态资源服务:Nginx可以直接提供静态文件服务,例如HTML、CSS、JavaScript、图片等,支持高并发和快速响应。
  • 反向代理:Nginx作为反向代理服务器,可以将客户端请求转发给后端服务器,例如Tomcat、Node.js、PHP等,实现负载均衡、高可用性和请求过滤等功能。
  • 动态内容处理:Nginx可以将动态请求转发给后端服务器处理,并将处理结果返回给客户端,例如CGI、FastCGI、uWSGI、SCGI、PHP-FPM等。
  • URL重写:Nginx可以使用正则表达式对URL进行重写,实现URL路由、转发、保护等功能。
  • SSL/TLS加密:Nginx支持SSL/TLS协议,可以对客户端和服务器之间的通信进行加密,提高安全性和保护隐私。
  • 缓存:Nginx可以对静态和动态资源进行缓存,减少后端服务器的负载和提高响应速度。
  • 日志记录:Nginx可以记录访问日志和错误日志,方便性能分析和故障排查。
  • 高并发和高性能:Nginx采用异步非阻塞I/O模型,支持高并发和高性能,适合用于处理大量并发请求。
  • 负载均衡:Nginx可以实现多种负载均衡策略,例如轮询、权重、IP hash等,提高系统的可扩展性和可靠性。

二、Nginx特性

1、反向代理

正向代理和反向代理都是代理服务器的一种应用,它们的区别在于代理的方向和使用场景不同。

正向代理(Forward Proxy):

  • 正向代理是客户端向代理服务器发送请求,代理服务器再将请求转发给目标服务器,目标服务器无法知道请求来自于哪个客户端,只知道请求来自于代理服务器。正向代理一般用于客户端无法直接访问目标服务器的情况,例如客户端位于内网或受到访问限制,需要通过代理服务器来访问互联网资源。正向代理可以实现访问控制、跨域、缓存和安全等功能。

反向代理(Reverse Proxy):

  • 反向代理是客户端向代理服务器发送请求,代理服务器再将请求转发给后端服务器,后端服务器无法知道请求来自于哪个客户端,只知道请求来自于代理服务器。反向代理一般用于后端服务器需要隐藏或者负载均衡的情况,例如一个网站后端有多台服务器,反向代理可以根据负载均衡算法将请求转发给不同的服务器,以达到均衡负载的目的。反向代理可以实现负载均衡、高可用性、安全过滤、SSL加密和统一入口等功能。

总之,正向代理和反向代理都是代理服务器的一种应用,它们的区别在于代理的方向和使用场景不同。正向代理用于客户端无法直接访问目标服务器的情况,而反向代理用于后端服务器需要隐藏或者负载均衡的情况。

2、负载均衡

负载均衡(Load Balancing)是一种将请求分发到多个服务器上的技术,以达到增加系统容量、提高可用性和性能的目的。负载均衡器可以将请求分发到多台服务器上,使每台服务器的负载得到均衡,从而提高整个系统的性能和可用性。

在Nginx中,负载均衡可以通过upstream模块实现。upstream模块定义了一组后端服务器,可以将请求分发到这些服务器上。通过配置upstream中的服务器列表,可以实现负载均衡的算法,包括轮询、加权轮询、IP哈希、URL哈希等多种算法。例如,以下是一个简单的upstream配置示例:

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
    server backend3.example.com;
}

这个配置定义了一个名为backend的upstream,其中包含三个后端服务器backend1.example.com、backend2.example.com和backend3.example.com。其中,backend1.example.com的权重为5,表示它处理的请求会比其他服务器多5倍。默认情况下,upstream采用轮询算法进行负载均衡,即将请求依次分配给每台服务器。可以通过配置不同的算法来实现不同的负载均衡策略。

在Nginx中,负载均衡的配置通常与反向代理一起使用,即将Nginx作为反向代理服务器,将请求分发到后端服务器上。通过配置反向代理服务器和upstream中的服务器列表,可以实现负载均衡的功能,并将请求转发到后端服务器上进行处理。

3、负载均衡策略

1.轮询(Round Robin)
这是默认的负载均衡策略。每个请求都会按照时间顺序逐一分配到不同的后端服务器上。

配置示例:

http {  
    upstream backend {  
        server backend1.example.com;  
        server backend2.example.com;  
        server backend3.example.com;  
        # 默认即为轮询  
    }  
 
    server {  
        listen 80;  
 
        location / {  
            proxy_pass http://backend;  
        }  
    }  
}

2.权重(Weighted Round Robin)
可以根据后端服务器的处理能力设置不同的权重,权重越大,分配到的请求就越多。

配置示例:

http {  
    upstream backend {  
        server backend1.example.com weight=5;  
        server backend2.example.com;  # 默认权重为 1  
        server backend3.example.com weight=3;  
    }  
 
    # ... 其余配置同轮询示例 ...  
}

3.IP 哈希(IP Hash)
根据客户端的 IP 地址进行哈希计算,将同一个 IP 地址的请求始终发送到同一台后端服务器上。这可以确保来自同一客户端的请求始终由同一台服务器处理,实现会话保持。

配置示例:

http {  
    upstream backend {  
        ip_hash;  
        server backend1.example.com;  
        server backend2.example.com;  
    }  
 
    # ... 其余配置同轮询示例 ...  
}

注意:当后端服务器数量变化时,可能会导致部分客户端的请求被发送到不同的服务器,因此在使用 IP 哈希时,需要谨慎考虑后端服务器的增减。

4.最少连接(Least Connections)
将请求分配给当前连接数最少的后端服务器。如果后端服务器的权重不同,则会先根据权重进行轮询,然后再根据连接数进行分配。

配置示例:

http {  
    upstream backend {  
        least_conn;  
        server backend1.example.com;  
        server backend2.example.com;  
    }  
 
    # ... 其余配置同轮询示例 ...  
}

注意:Nginx 原生并不直接支持最少连接策略,但可以使用第三方模块如 ngx_http_upstream_least_conn_module 来实现。

5.通用哈希(Generic Hash)
与 IP 哈希类似,但可以根据其他变量(如请求 URI)进行哈希计算,实现更灵活的会话保持。

配置示例(假设使用第三方模块):

http {  
    upstream backend {  
        hash $request_uri consistent;  
        server backend1.example.com;  
        server backend2.example.com;  
    }  
 
    # ... 其余配置同轮询示例 ...  
}

注意:consistent 关键字用于指定使用一致性哈希算法,这有助于在添加或删除服务器时保持哈希结果的一致性。

6.最少响应时间(Least Time)
将请求分配给响应时间最短的后端服务器。这通常需要使用第三方模块如 ngx_http_upstream_fair_module 来实现。

配置示例(假设使用第三方模块):

http {  
    upstream backend {  
        fair;  
        server backend1.example.com;  
        server backend2.example.com;  
    }  
 
    # ... 其余配置同轮询示例 ...  
}

注意:fair 关键字用于启用最少响应时间策略。

7.其他自定义策略
还可以使用 Lua 脚本或其他第三方模块来实现更复杂的自定义负载均衡策略。

4、动静分离

动静分离是一种将动态请求和静态请求分开处理的技术,可以提高服务器的性能和稳定性。动态请求通常是指需要通过程序生成的,包括动态网页、动态图片、动态数据等;静态请求通常是指静态资源,如HTML、CSS、JavaScript、图片、视频等,这些资源在请求时并不需要进行处理,可以直接返回给客户端。

在Nginx中,可以通过配置实现动静分离。具体实现方式如下:

  1. 将动态请求交给FastCGI或uWSGI等程序处理,例如PHP、Python等。
  2. 将静态请求直接从服务器本地文件系统中返回,无需通过程序处理。
  3. 将动态请求和静态请求分别放到不同的服务器或者不同的端口上,通过Nginx的反向代理功能进行请求分发。
    例如,以下是一个简单的Nginx配置示例,实现动静分离的功能:
http {
    server {
        listen 80;
        server_name example.com;
        # 静态文件的根目录
        root /var/www/static;
        # 处理动态请求
        location /api/ {
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME /var/www/example.com/index.php;
        }
        # 处理静态请求
        location / {
            expires 1d;
            add_header Cache-Control "public";
        }
    }
}

这个配置定义了一个Nginx服务器,其中静态文件的根目录为/var/www/static。当请求/api/路径时,会将请求转发给FastCGI服务器处理;当请求其他路径时,Nginx会直接返回静态文件,例如HTML、CSS、JS等。通过这种方式,可以将动态请求和静态请求分开处理,提高服务器性能和稳定性。

动静分离还可以用于前后端打包部署场景。如下,前端打包后放到 /usr/share/nginx/html/swp 目录下,然后访问 8811主页时默认跳转到index.html页面。前端请求后端接口的时候 打包时带一个 prod-api 即可跳转到后端 网关的端口地址 http://localhost:32080,500 502 503 504报错跳转到 html下面调的 50x.html 自定义页面。rewrite 表示重定向 过滤掉路径上面的prod-api。
例如前端请求地址:http://localhost:8811/prod-api/admin-api/wms-core/out/manage/out/page
nginx转发后的地址为:http://localhost:32080/admin-api/wms-core/out/manage/out/page

server{
        listen 8811;
        root /usr/share/nginx/html/swp;
        location / {
                try_files $uri $uri/ index.html;
        }

        location ~* ^/(prod-api) {
           proxy_connect_timeout 15s;
           proxy_send_timeout 15s;
           proxy_read_timeout 15s;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto http;
           rewrite ^/prod-api/(.*)$ /$1 break;
           proxy_pass http://localhost:32080;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

5、如何获取前端IP地址

通过nginx反向代理之后,后端如何获取前端IP地址呢?

使用 Nginx 作为反向代理来代理后端服务时,默认情况下,后端服务看到的客户端 IP 地址(即前端页面的 IP 地址)会被替换为 Nginx 服务器的 IP 地址(或者称为代理服务器的 IP 地址),因为请求是从 Nginx 转发到后端服务的。

但是,Nginx 提供了一个功能,允许您将原始客户端的 IP 地址作为请求头的一部分转发给后端服务。这个功能是通过 $http_x_forwarded_for 变量实现的。

以下是如何在 Nginx 配置中设置以将原始客户端 IP 转发给后端服务的步骤:

1. 在 Nginx 配置中设置 proxy_set_header 指令:

在您的 location 块中,添加或修改 proxy_set_header 指令以包含 $http_x_forwarded_for 变量。这告诉 Nginx 在将请求转发到后端服务时,在请求头中设置一个名为 X-Forwarded-For 的头,其值为原始客户端的 IP 地址。

location / {  
    proxy_pass http://your_backend_server;  
    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_add_x_forwarded_for 变量包含了 $http_x_forwarded_for 的值(如果存在),以及 $remote_addr(即客户端的 IP 地址,直接连接到 Nginx 的 IP)。这有助于在多层代理环境中追踪原始 IP 地址。

2. 在后端服务中读取 X-Forwarded-For 头:

现在,当后端服务接收到来自 Nginx 的请求时,它应该能够读取 X-Forwarded-For 请求头来获取原始客户端的 IP 地址。这取决于您使用的后端技术栈(如 Node.js、Python、Java 等),但通常您可以在处理请求的代码中访问请求头。

例如,在 Node.js 的 Express 框架中,您可以使用 req.headers[‘x-forwarded-for’] 来获取该值。但是请注意,由于可能存在多层代理,X-Forwarded-For 的值可能是一个由逗号分隔的 IP 地址列表。通常,列表中的第一个 IP 地址是原始客户端的 IP 地址。

3. 注意安全性:

由于 X-Forwarded-For 头可以被任何客户端或中间代理修改,因此它不应该被用作安全决策的唯一依据。它应该被视为一个方便的工具,用于日志记录、调试和某些非关键性任务。如果您需要基于 IP 地址进行安全决策(如访问控制),请考虑使用其他更可靠的方法,如 VPN、IPSec 或其他网络级别的安全措施。

三、Nginx安装-windows版本

nginx中文网

1、nginx配置

解压到英文目录下,打开/nginx-1.21.6/conf/nginx.conf配置如下,即可通过访问80端口代理到8080和8081端口
在这里插入图片描述

四、Nginx安装-linux版本

1、地址

nginx中文网

2、常用命令

使用 nginx 操作命令前提条件:必须进入 nginx 的目录.usr/local/nginx/sbin

  • ./nginx -v : 查看nginx版本 和 相关配置
  • ./nginx -s stop : 停止nginx服务
  • ./nginx : 启动nginx服务
  • ./nginx -t :校验nginx配置是否正确
  • ./nginx -s reload : 重启,重新加载配置文件

3、配置nginx环境变量

vim ~/.bashrc

然后在最下面添加,nginx/sbin 路径,并保存退出

export PATH="$PATH:/usr/local/nginx/sbin"

让配置文件立即生效

source ~/.bashrc

查看是否配置成功
在这里插入图片描述

五、Nginx高可用

1、upstream 参数

Nginx 的 upstream 模块是用于实现负载均衡和高可用性的重要功能。通过 upstream 模块,Nginx 可以将请求分发到多个后端服务器上,以提高系统的性能和可靠性。下面对 Nginx 的 upstream 功能进行详细解释:

upstream backend {
    server 192.168.1.100;
    server 192.168.1.101;
    server 192.168.1.102:8080 weight=3;
}

上面的示例定义了一个名为 “backend” 的 upstream 块,其中包含三个服务器定义,分别是 IP 地址为 192.168.1.100、192.168.1.101 和 192.168.1.102 的后端服务器。第三个服务器定义还指定了权重为 3,表示该服务器应该分配比其他服务器更多的请求。

  • 负载均衡算法:Nginx 支持多种负载均衡算法,用于决定将请求分发到哪个后端服务器。默认情况下,Nginx 使用轮询算法(round-robin)按顺序将请求发送到每个服务器。除此之外,还可以使用其他算法,如加权轮询、IP hash、least_conn 和 least_time 等。
upstream backend {
    server 192.168.1.100;
    server 192.168.1.101;
    server 192.168.1.102;

    ip_hash;
}

上面的示例在 upstream 块中添加了 ip_hash 指令,这将根据客户端的 IP 地址将其请求路由到相同的服务器,以保持会话的连接性。

  • 失败和故障转移:当后端服务器发生故障或无法响应请求时,Nginx 具备故障转移能力。Nginx
    会自动将请求路由到其他正常工作的服务器上,确保服务的可用性。可以根据情况调整故障转移的超时时间和重试次数。
upstream backend {
    server 192.168.1.100;
    server 192.168.1.101 backup;
    server 192.168.1.102;

    fail_timeout=10s;
    max_fails=3;
    slow_start=30s;
}

上面的示例中,第二个服务器定义被标记为 backup,意味着它仅在其他服务器都不可用时才会被用于请求。还可以使用 fail_timeout 指令设置服务器的故障超时时间,并使用 max_fails 指令设置达到最大故障次数后的重试行为。此外,可以使用 slow_start 指令设置新服务器加入负载均衡前的预热时间,以平滑地增加服务器的负载。

  • 健康检查:Nginx 支持通过健康检查机制来检测后端服务器的状态。这些健康检查可以定期发送请求到后端服务器,并检查其响应的状态码和响应时间等。如果服务器被标记为不可用或响应时间过长,Nginx 将自动将其从负载均衡器中排除。
upstream backend {
    server 192.168.1.100;
    server 192.168.1.101;

    check interval=5s rise=2 fall=3 timeout=2s;
}

上面的示例中,通过使用 check 指令启用健康检查功能。interval 指令用于设置健康检查的间隔时间,rise 和 fall 指令用于设置成功和失败计数的阈值,而 timeout 指令用于设置检查请求的超时时间。

总结来说,Nginx 的 upstream 功能通过配置后端服务器列表、负载均衡算法、故障转移和健康检查等功能,可以实现负载均衡和高可用性。通过适当配置和使用合适的参数,可以实现系统的高性能和可靠性。虽然 Nginx 可以通过负载均衡和故障转移来分发请求和处理服务器故障,但它无法解决其他与高可用性相关的问题,如数据同步、故障检测和恢复、数据一致性等。

2、location

location中返回的url主要有两个参数:return 和 proxy_pass

return 指令本身不会进行访问代理或转发,它只是生成一个响应并返回给客户端。如果你想使用 Nginx 转发请求到另一个 URL,可以使用 proxy_pass 指令

举个例子,假设有以下 Nginx 配置:

server {
    listen 80;
    server_name example.com;

    location /redirect {
        return 302 http://example.com/new-location;
    }
}

当客户端访问 http://example.com/redirect 时,Nginx 将返回一个 302 重定向响应,并将客户端重定向到 http://example.com/new-location。

当客户端收到这个重定向响应后,它会再次发起请求访问 http://example.com/new-location。这次的请求将会经过 Nginx 的处理,并根据配置中的其他 location 块进行匹配和处理。

其他

1、如果报错:no resolver defined to resolve(没有定义要解析的解析器)

在 Nginx 配置文件中添加一个 DNS 解析器:

http {
    resolver 8.8.8.8;
    ...
}

在上述示例中,将 DNS 解析器配置为 Google 的公共 DNS 服务器 8.8.8.8。你也可以使用其他可用的 DNS 解析服务器。对于重新加载配置:在终端中运行 nginx -s reload 命令(需要配置nginx/sbin环境变量)。

2、nginx仅会对配置的端口进行拦截转发
如 8011端口在nginx中没有配置,但是服务端有这个端口,并且可以访问,那么是可以绕过nignx直接访问到服务端的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值