首页 > 系统相关 >tengine/nginx https请求 转发 http upstream

tengine/nginx https请求 转发 http upstream

时间:2024-07-03 10:10:15浏览次数:21  
标签:缓存 aaa ssl nginx https upstream http

转载自:https://blog.csdn.net/windywolf301/article/details/135548805?spm=1001.2014.3001.5502

为什么要将https转发为http

当前的互联网应用基本都要支持https协议,而当浏览器头通过https协议将请求发到到负责负载的nginx后,会由当前nginx再以http协议向后端upstream进行请求,之所以这么做是因为https协议的安全性也带来的额外的性能消耗。而源端基本都是在一个内网里面的,对于通讯协议的安全性要求没那么高,采用http协议通讯性能会更优,也能降低证书的部署成本。

因此在实际应用中的部署架构如下方所示

浏览器 ---- https (http2) —> nginx (负载均衡) ---- http1.1—> nginx/tomcat/node (upstream 源端)
如何配置

假设我当前的域名为 aaa.com
并且已经有了aaa.com的ssl证书(自签或购买),本文重点不在于如何生成证书,具体就不写了。

证书会包含2个文件:
aaa_com.key , aaa_com.crt

建议将这2个文件cpoy到 nginx的安装目录(默认为:/usr/local/nginx)的ssl目录中(需要自行创建)

然后创建aaa.com的虚拟主机配置文件aaa.conf,示例如下

server {
        listen 80;
        server_name www.aaa.com aaa.com;
	    access_log /data/log/nginx/aaa_access.log  main;
        error_log  /data/log/nginx/aaa_error.log;
	        
        #核心代码
        rewrite ^(.*)$ https://${server_name}$1 permanent;
}

#配置源端
upstream aaa-upstream {
            #源端的ip与端口
            server x.x.x.x:port weight=5 max_fails=3 fail_timeout=30s;
    }



server {
        server_name  www.aaa.com aaa.com;
        
	    #https相关配置,开启http2.0
	    #启用https需要安装openssl,同时在安装nginx的时候添加 --with-http_ssl_module --with-http_v2_module
	    listen 443 ssl http2;

        #指定证书位置
        ssl_certificate /usr/local/nginx/ssl/aaa_com.crt;
        ssl_certificate_key /usr/local/nginx/ssl/aaa_com.key;
		
        ssl_session_cache shared:SSL:10m;  
	#1m大约可以存储4000个TLS握手,当某个https连接在规定时间重连时,可以通过session_cahce重用TLS秘钥,也就是client只要发起一次http请求就可以再次进行连接。
	#根据TLS通讯过程,如果你的https开启了session_cache,在第二步,server获取到client请求就会去读取session_cache文件,如果存在client的key就直接复用,进行数据传输。
        #设置存储会话参数的高速缓存的类型和大小。缓存可以是以下任何一种类型:
        # off 严禁使用会话缓存:nginx明确告诉客户端会话可能不会被重用。
        # none 会话缓存的使用被轻轻地禁止:nginx告诉客户端会话可能被重用,但实际上不会将会话参数存储在缓存中。
        # builtin 建立在OpenSSL中的缓存; 仅由一个工作进程使用。缓存大小在会话中指定。如果没有给出大小,则等于20480个会话。内置缓存的使用可能导致内存碎片。
        # shared 所有工作进程之间共享的缓存。缓存大小以字节为单位指定; 一兆字节可以存储大约4000个会话。每个共享缓存都应该有一个任意的名字。具有相同名称的缓存可以在多个虚拟服务器中使用。
        # 两种缓存类型都可以同时使用,例如:ssl_session_cache builtin:1000 shared:SSL:10m;
        #注意:但只使用没有内置缓存的共享缓存应该更有效率。
                            
        #ssi on;    #服务器嵌套,主要是实现网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。
	    ssl_session_timeout 10m;

        access_log /data/log/nginx/aaa_access.log  main;
        error_log  /data/log/nginx/aaa_error.log;
		


        location / {
                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_http_version 1.1; #这行很关键,没有的话可能导致https访问报bad request 400
                proxy_set_header Upgrade $http_upgrade; # 做websocket应用,需要实时感知客户端头信息变化的场景需要加
                proxy_set_header Connection "upgrade";  # 做websocket应用,需要实时感知客户端头信息变化的场景需要加
                #设定回源通过http协议
                proxy_pass http://aaa-upstream;
		

        }

}

重点说明

要启用nginx https支持,需要在安装openssl,并安装–with-http_ssl_module --with-http_v2_module 模块,有需要可以参考tengine安装(包含常用模块)

建议开启 ssl会话缓存,降低握手时间 ssl_session_cache shared:SSL:10m;

proxy_http_version 1.1; 需要重点关注,在实际使用中发现,不配置的话,可能会导致转发到源端的http请求变成http1.0协议,从而导致源端报bad request 400的异常(如果源端也是一个nginx负载的情况下),而且http1.0协议的性能最差,最好还是加上。

websocket 应用场景(比如IM实时通讯),开启以下配置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"

这2行都是为了实时让服务端能感知到客户端的状态变化

创建好的aaa.conf,可以放到nginx安装目录下的conf/site/下,同时在conf/nginx.conf中的http对象配置中添加 include site/*.conf; 以便于各站点配置的分别维护
遇到问题先定位一下是那一层出了问题,是负载层,还是源端层,再判断问题根源

标签:缓存,aaa,ssl,nginx,https,upstream,http
From: https://www.cnblogs.com/hahaha111122222/p/18281051

相关文章

  • nginx配置获取客户端的真实ip
    https://blog.csdn.net/superzhang6666/article/details/132901093 对于nginx获取客户端真实ip做个总结对于首层代理服务器,使用proxy_set_headerX-Forwarded-For$remote_addr;来将客户端IP赋值给X-Forwarded-For请求头对于非首层代理服务器,使用proxy_set_headerX-Forwarded......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验
    场景:kettle调用https接口,跳过校验SSL。(有些公司内部系统之间的https的接口是没有SSL校验这一说,无需使用用证书的) 解决方案:自定义插件或者自定义jar包通过javascript调用https接口。1、httppost步骤调用https接口,无法通过ssl安全校验,如下图所示:查看了kettle源码之后该步骤......
  • Nginx proxy manager反向代理docker hub
    1.域名解析用作反向代理的域名要提前解析,如果使用外国的DNS域名提供商的话,最好提前一天解析好。2.配置NPM2.1.Details选项卡2.2.SSL选项卡2.3.Advanced选项卡location/{#Dockerhub的官方镜像仓库proxy_passhttps://regis......
  • httprunner断言-兼容细微出入的响应内容
    背景:9mobile,可能存在不统一的其他名字:NINEMOBILE/NINE_MOBILE/9MOBILEsmile,可能存在不统一的其他名字:SMILE/Smile/一串数字id(如26479376494)问题:解析手机号,归属那个运营商,兼容上述问题:方案:思考方案:方案一:是否可以在hrp的框架基础上断言多个预期值。方案二......
  • Nginx配置以及热升级
    目录Nginx详解1.Nginx关键特性2.Nginx配置2.1event2.2http2.2.1log_format2.2.2sendfile2.2.3tcp_nopush2.2.4tcp_nodelay2.2.5keepalive_timeout2.2.6include2.2.7default_type2.2.8server3.配置Nginx虚拟主机3.1基于端口3.2基于IP3.3基于域名4.Location4.1拒......
  • logstash 收集 http POST请求中的json日志时,字段冲突问题
    https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http.html修改vim/etc/logstash/logstash.ymlpipeline.ecs_compatibility:disabled不关闭的话,会自动添加这几个字段可能会与json中的同名字段冲突{"@version"=>"1","user_agent"......
  • Nginx超时重试、保护机制
    1.超时配置http{upstreambackend{serverbackend1.example.com;serverbackend2.example.com;serverbackend3.example.com;}server{location/{proxy_passhttp://backend;proxy_connec......
  • 多个vue项目nginx部署流程
    nginx部署流程#在nginx.conf中配置#usernobody;worker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;events{worker_connections1024;}http{incl......
  • Nginx跨域问题
    目录Nginx跨域实现跨域场景跨域问题的解决方案Nginx配置跨域解决Nginx跨域实现首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现。哪些情况属于跨域?跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容注:同源策略,单说来就是同协议,同域名,同端口UR......