关于nginx:Nginx如何反向代理延时响应SLL

39次阅读

共计 6795 个字符,预计需要花费 17 分钟才能阅读完成。

在前端生态中,代理服务扮演着重要的角色。代理服务是指一种中间层服务,用于在前端应用程序和后端服务器之间进行申请转发和数据交互。它能够提供以下性能和劣势:

  1. 跨域申请:代理服务能够解决浏览器的同源策略限度,使前端利用能够从不同的域名或端口申请数据。通过代理服务,前端利用能够将申请发送到同一域名下的代理服务器,并由代理服务器转发到指标服务器,从而防止跨域限度。
  2. 安全性和隐衷爱护:代理服务能够在前端和后端之间充当平安屏障,暗藏后端服务器的实在地址和细节。通过代理服务,能够实现平安的数据传输、身份验证和访问控制,爱护后端服务器的安全性,并提供额定的隐衷爱护。
  3. 缓存和性能优化:代理服务能够缓存动态资源或响应后果,以加重后端服务器的负载,并进步前端利用的性能。通过在代理层缓存数据,能够缩小对后端的申请次数,放慢响应速度,并缩小对网络带宽的占用。
  4. 申请转发和路由:代理服务能够依据特定的规定和条件将申请转发到不同的后端服务器,实现申请的负载平衡、路由和散发。这使得前端利用能够灵便地依据需要将申请发送到不同的服务实例或后端集群。
  5. 日志记录和监控:代理服务能够记录申请和响应的日志,并提供监控和剖析性能。通过代理服务,能够收集对于申请流量、性能指标和谬误日志的信息,帮忙进行故障排查、性能优化和系统监控。

总而言之,代理服务在前端生态中扮演着要害的角色,提供了跨域申请、安全性、性能优化、申请转发和监控等性能。它在构建古代前端利用中施展着重要作用,帮忙开发人员解决跨域问题、进步性能并提供更好的用户体验。

装置 nginx

这里咱们以 nginx/1.12.2 为例。须要获取源码:

$ cd /opt/
$ wget http://nginx.org/download/nginx-1.12.2.tar.gz
$ tar -zxvf nginx-1.12.2.tar.gz

编译装置

$ cd /opt/nginx-1.12.2/
$ sudo make -j2
$ sudo make install

make install 后,会笼罩之前装置的 NginxMac 通常会装置在 /usr/local/ 目录下。

Nginx 配置反向代理

Nginx 中配置反向代理非常简单。上面是一个根本的反向代理配置示例:

编辑 Nginx 配置文件:

$ sudo vim /usr/local/nginx/conf/nginx.conf 

增加如下配置项:

server {
  listen 80;
  server_name example.com;

  location / {proxy_pass http://backend_server;}
}

启动 Nginx

$ sudo /usr/local/nginx/sbin/nginx

如果曾经启动了,执行上面命令从新加载配置文件:

$ sudo /usr/local/nginx/sbin/nginx -s reload

如果想要进行服务,执行上面命令:

$ sudo /usr/local/nginx/sbin/nginx -s stop

在上述示例中,咱们创立了一个服务器块(server block),监听 example.com 的端口 80。在 location / 块中,咱们应用了 proxy_pass 指令将申请代理到名为 backend_server 的后端服务器。

确保将 example.com 替换为您的域名或服务器 IP,将 backend_server 替换为理论的后端服务器地址。

Nginx 配置提早响应

echo-nginx-module 是一个用于 NGINX 的第三方模块,它容许在 NGINX 中进行自定义响应的生成和解决。该模块提供了一些指令和变量,能够用来构建自定义的响应内容。能够应用它来实现延时响应:

获取 echo-nginx-module 源代码,咱们下载最新稳定版(截止到 2018-12-23),并解压,不必装置

$ cd /opt
$ wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
$ tar zxvf v0.61.tar.gz

编译 Nginx 并增加 echo-nginx-module

$ cd /opt/nginx-1.12.2/
$ ./configure --prefix=/usr/local/nginx --add-module=/opt/echo-nginx-module-0.61

请将 /opt/echo-nginx-module-0.61 替换为您理论寄存 echo-nginx-module 源代码的门路。

运行下面的 ./configure 后进行编译装置:

$ sudo make install

make install 后,会笼罩之前装置的Nginx

配置延时响应

/usr/local/nginx/conf/nginx.confserver 代码块里退出如下代码:

location /hello_echo { 
    # 延时 5 秒
    set $delay 5;
    echo_sleep $delay;
    default_type 'text/plain'; 
    echo "Delayed response after 5 seconds";
}

从新加载配置文件:

$ sudo /usr/local/nginx/sbin/nginx -s reload

参考文章:https://www.cnblogs.com/52fhy/p/10166333.html

Nginx 配置 SSL

with-http_ssl_moduleNGINX 的一个编译选项,用于在构建 NGINX 时增加反对 SSL/TLS 的功能模块。

SSL(Secure Sockets Layer)和其继任者 TLS(Transport Layer Security)是用于加密网络通信的协定。它们容许在客户端和服务器之间建设平安的加密连贯,以爱护数据的机密性和完整性。

通过配置 NGINX 编译时退出 with-http_ssl_module,你能够启用 NGINXSSL/TLS 性能。这样,NGINX 将可能解决加密连贯、反对 HTTPS 协定以及提供 SSL/TLS 相干的配置指令。

要应用 with-http_ssl_module,你须要依照以下步骤编译 NGINX

1、配置 with-http_ssl_module 模块
Nginx 配置 SSL 须要配置 http_ssl_module 模块

$ cd /opt/nginx-1.12.2/
$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module
$ sudo make install

2、生成私钥和自签名证书
创立任意名文件夹,假如为~/ssl, 在其中新建文件 sslConfigureFile.conf

[req]
 
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only
 
[subject]
 
countryName                 = Country Name (2 letter code)
countryName_default         = CN
 
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
 
localityName                = Locality Name (eg, city)
localityName_default        = Nanjing
 
organizationName            = Organization Name (eg, company)
organizationName_default    = Example, LLC
 
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_default          = Example Company
 
emailAddress                = Email Address
emailAddress_default        = test@example.com
 
[x509_ext]
 
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
 
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment
subjectAltName         = @alternate_names
nsComment              = "OpenSSL Generated Certificate"
 
[req_ext]
 
subjectKeyIdentifier = hash
 
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"
 
[alternate_names]
 
DNS.1       = local.cmsk1979.com # 此处须要改为本地域名,如有须要可配合 /etc/hosts 批改

执行命令生成证书文件:

openssl req -config sslConfigureFile.conf -new -sha256 -newkey rsa:2048 -nodes -keyout ssl.key -x509 -days 365 -out ssl.crt

注:sslConfigureFile.conf 文件门路肯定要精确

按提醒执行完该命令后,将生成以下文件

~/ssl/ssl.key
~/ssl/ssl.crt

3、信赖证书
双击生成的证书进入“钥匙串拜访”,找到对应的证书

双击,抉择始终信赖,浏览器拜访就不会提醒“不平安拜访”

4、将私钥和证书文件复制到适当的地位

将生成的私钥文件 ssl.key 和证书文件 ssl.crt 复制到 Nginx 配置文件所在的目录(/usr/local/ssl)。

5、配置 Nginx 应用自签名证书
关上 Nginx 的配置文件(通常是 /usr/local/nginx/conf/nginx.conf)。

在适当的 server 块中,增加以下 SSL/TLS 配置:

server {
  listen 443 ssl;
  server_name local.cmsk1979.com;

  ssl_certificate /usr/local/ssl/ssl.crt;
  ssl_certificate_key /usr/local/ssl/ssl.key;

  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
    
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers  on;

  # 其余 Nginx 配置...
  location /hello {
    default_type 'text/plain';
    return 200 'hello!';
  }
}

6、配置hosts

127.0.0.1    www.local.cmsk1979.com
127.0.0.1    local.cmsk1979.com

7、从新加载配置文件:

sudo /usr/local/nginx/sbin/nginx -s reload

留神:拜访时不能开启 VPN 代理,不然可能呈现拜访失败

拜访后果:

加上延时响应

http_ssl_module 模块和 echo-nginx-module 编译到 Nginx 中:

$ cd /opt/nginx-1.12.2/
$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/opt/echo-nginx-module-0.61
$ sudo make install

在适当的 server 块中,增加 SSL/TLS 和延时响应的配置:

server {
  listen 443 ssl;
  server_name local.cmsk1979.com;

  ssl_certificate /usr/local/ssl/ssl.crt;
  ssl_certificate_key /usr/local/ssl/ssl.key;

  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
    
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers  on;

  # 其余 Nginx 配置...
  location /hello {
    set $delay 5;
    echo_sleep $delay;
    default_type 'text/plain';
    echo "Delayed response after 5 seconds";
  }
}

加上反向代理

以反向代理获取 https://mstatic.cassmall.com/assets/sensors/sensorsdata1.19.4.min.js 为例,在适当的 server 块中,增加 SSL/TLS 和延时响应、反向代理的配置:

server {
  listen 443 ssl;
  server_name local.cmsk1979.com;

  ssl_certificate /usr/local/ssl/ssl.crt;
  ssl_certificate_key /usr/local/ssl/ssl.key;

  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
    
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers  HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers  on;

  # 其余 Nginx 配置...
  location /assets/sensors {
    set $delay 5;
    echo_sleep $delay;
    # 传递客户端申请的头信息给指标服务器
    proxy_pass https://mstatic.cassmall.com;
  }
}

能够看到代理拜访是胜利的,然而延时响应的配置没有失效

这是因为 echo_sleepecho-nginx-module 提供的内容处理程序,而 proxy_passngx_http_proxy_module 提供的内容处理程序,如果在单个地位中应用这两个不同的内容处理程序,它们将发生冲突(因为 Nginx 只容许单个处理程序),并且只有一个会失效(哪个会失效是不确定的)。

GitHub 有一个 issue:https://github.com/openresty/echo-nginx-module/issues/5

如果咱们对调一些配置的程序:

location /assets/sensors {
    # 传递客户端申请的头信息给指标服务器
    proxy_pass https://mstatic.cassmall.com;
    set $delay 5;
    echo_sleep $delay;
  }

能够看到延时响应失效,而反向代理配置没有失效

上面给出了一个解决办法,你能够应用 echo_location 来向由 proxy_pass 配置的地位发送子申请,像这样:

# 定义一个命名地位
location /proxy/ {rewrite ^/proxy/(.*)$ /$1 break;
    proxy_pass https://mstatic.cassmall.com;
}

location /assets/sensors {
    set $delay 5;
    echo_sleep $delay;
    # 应用 echo_location 发送子申请到 /proxy 地位
    echo_location /proxy/$uri;
}

返回的脚本内容出现乱码

批改配置:

# 定义一个命名地位
location /proxy/ {rewrite ^/proxy/(.*)$ /$1 break;
    proxy_pass https://mstatic.cassmall.com;
    proxy_set_header Accept-Encoding "";
    proxy_set_header Accept-Language $http_accept_language;
    proxy_set_header Content-Type "text/javascript; charset=utf-8";
}

location /assets/sensors {
    set $delay 5;
    echo_sleep $delay;
    # 应用 echo_location 发送子申请到 /proxy 地位
    echo_location /proxy/$uri;
}

正文完
 0