nginx將https協(xié)議反向代理到http協(xié)議請求上的實(shí)現(xiàn)
1、問題背景
目前一個系統(tǒng)僅支持https協(xié)議訪問,因后端服務(wù)基于ssl協(xié)議,前端在請求是也需要支持ssl協(xié)議的https請求來訪問。目前的代理服務(wù)器是nginx,現(xiàn)在想要通過http訪問系統(tǒng),需通過nginx的反向代理或者重定向方式將https請求代理為http請求??蓪?shí)現(xiàn)的做法有如下幾種:
1、使后端開放兩種端口,一個端口支持https協(xié)議訪問,一個端口支持http協(xié)議訪問,之后前端請求通過nginx代理,同時nginx也開放兩個端口(比如80端口作為http訪問,443端口作為https訪問系統(tǒng))。使不同協(xié)議走不同的后端服務(wù)
2、使用nginx的重定向功能,每次http請求過來后重定向?yàn)閔ttps請求
3、使用nginx的反向代理功能,將將https協(xié)議反向代理到http協(xié)議請求上
2、介紹nginx的反向代理功能及配置https協(xié)議
反向代理是一種服務(wù)器架構(gòu),它接收來自客戶端的請求,然后將這些請求轉(zhuǎn)發(fā)到一個或多個后端服務(wù)器,并將后端服務(wù)器的響應(yīng)返回給客戶端。
與正向代理的區(qū)別:
正向代理是客戶端與代理服務(wù)器之間的一種代理模式。在正向代理中,客戶端請求首先發(fā)送到代理服務(wù)器,然后由代理服務(wù)器轉(zhuǎn)發(fā)請求給目標(biāo)服務(wù)器。代理服務(wù)器代表客戶端發(fā)送請求,目標(biāo)服務(wù)器并不知道實(shí)際發(fā)出請求的客戶端身份
反向代理是服務(wù)器與后端服務(wù)器之間的一種代理模式。在反向代理中,客戶端請求首先發(fā)送到反向代理服務(wù)器,然后由反向代理服務(wù)器根據(jù)配置將請求轉(zhuǎn)發(fā)給后端的一個或多個服務(wù)器。后端服務(wù)器的響應(yīng)再由反向代理服務(wù)器返回給客戶端??蛻舳瞬恍枰篮蠖朔?wù)器的實(shí)際存在。
反向代理就像商店的售貨員,當(dāng)你去商店購物時,你與售貨員打交道,但實(shí)際上商品是從后面的倉庫取出來的。售貨員幫你獲取商品,然后交給你。在這個比喻中,售貨員就是反向代理,倉庫就是后端服務(wù)器,你則是客戶端。
nginx配置https請求,主要是如下方式,且通過location指令將請求代理都后端的https接口上
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /path/to/ssl/certificate.crt; ssl_certificate_key /path/to/ssl/private.key; location / { # 處理HTTPS請求的配置 proxy_pass https://backend_server; } }
3、具體實(shí)現(xiàn)
3.1 后端服務(wù)支持方式
springboot應(yīng)用中,可以通過配置文件方式配置開啟端口,但是協(xié)議只能指定一個,如下:通過application.yml的server屬性可以配置一個https協(xié)議訪問的應(yīng)用端口
如果想要再次打開一個端口支持http請求,需要根據(jù)使用的后端服務(wù)器編寫配置類,當(dāng)前項(xiàng)目使用的是Jeety服務(wù)器,配置類代碼如下:
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HttpConfig { @Bean public WebServerFactoryCustomizer<JettyServletWebServerFactory> servletContainer() { return server -> { server.setPort(8081); // 這里配置 HTTP 端口為 8081,也可以通過加配置文件方式獲取 }; } }
這時候啟動項(xiàng)目,會同時開放兩個端口,之后通過nginx代理即可。
3.2 nginx重定向方式
配置 Nginx 以監(jiān)聽 HTTP(80)和 HTTPS(443)端口: 在 Nginx 配置中創(chuàng)建一個服務(wù)器塊,分別監(jiān)聽 HTTP 和 HTTPS 端口。
配置如下:
server { listen 80; server_name yourdomain.com www.yourdomain.com; location / { return 301 https://$host$request_uri; # 將 HTTP 請求重定向到 HTTPS } } server { listen 443 ssl; server_name yourdomain.com www.yourdomain.com; ssl_certificate /path/to/ssl/certificate.crt; ssl_certificate_key /path/to/ssl/private.key; # 這里可以添加其他 HTTPS 相關(guān)的配置 }
return: 這是 Nginx 的一個指令,用于生成 HTTP 響應(yīng)。
301: 這是 HTTP 狀態(tài)碼,表示永久重定向。當(dāng)瀏覽器或客戶端收到這個狀態(tài)碼時,它會知道請求的 URL 已永久性地移動到新的位置,因此應(yīng)該更新書簽或緩存。
https://$ host $ request_uri: 這是重定向的目標(biāo) URL。$ host 是 Nginx 內(nèi)置變量,代表用戶請求的主機(jī)名。$request_uri 也是一個內(nèi)置變量,代表用戶請求的 URI(包括查詢參數(shù))。這部分指定了用戶將被重定向到的 HTTPS 版本的 URL,包括相同的主機(jī)名和請求路徑。
之后通過重新加載 Nginx 配置: 保存配置文件并重新加載 Nginx,以使更改生效。命令如下:
sudo ./nginx -s reload
遇到問題:通過這種方式,真正請求還是會發(fā)到https協(xié)議下,而且瀏覽器訪問http時候會被重定向?yàn)閔ttps。也就是只能做到http訪問后被轉(zhuǎn)換為https協(xié)議,無法真正使用http請求訪問。
真實(shí)結(jié)果是被301重定向:
3.3、nginx的反向代理方式
將 HTTP 請求代理到 HTTPS,而不執(zhí)行重定向,可以在 HTTP 的服務(wù)器塊中使用代理,這個配置將 HTTP 請求代理到 HTTPS,而不執(zhí)行重定向。這意味著瀏覽器仍然發(fā)送 HTTP 請求,但 Nginx 將它們代理到相同域名的 HTTPS 端口,然后將響應(yīng)返回給瀏覽器。并且仍然會在內(nèi)部使用 HTTPS 連接,因此數(shù)據(jù)仍然會通過加密傳輸。如下所示:
# 配置 HTTP 服務(wù)器塊,監(jiān)聽 HTTP 請求并代理到 HTTPS server { listen 80; server_name yourfrontenddomain.com; # 指定前端域名 location / { proxy_pass https://yourdomain.com; # 將 HTTP 請求代理到 HTTPS add_header 'Access-Control-Allow-Origin' 'http://yourfrontenddomain.com'; # 允許跨域請求來自指定域名 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # 允許的 HTTP 方法 add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept'; # 允許的請求頭 #代理后保證cookie傳遞 proxy_cookie_path / /; # 啟用WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } # 配置 HTTPS 服務(wù)器塊,用于 HTTPS 請求 server { listen 443 ssl; server_name yourdomain.com www.yourdomain.com; # 指定后端域名和可能的 www 子域名 ssl_certificate /path/to/ssl/certificate.crt; # 指定 SSL 證書的路徑 ssl_certificate_key /path/to/ssl/private.key; # 指定 SSL 私鑰的路徑 # 這里可以添加其他 HTTPS 相關(guān)的配置,如 SSL 版本、密碼套件等 }
通過nginx的http代理https請求中,如果發(fā)生了cookie無法傳遞,或者其他跨域錯誤,可能還需要具體分析問題,但是目前這樣是可行的。
http訪問結(jié)果如下:
https訪問結(jié)果如下:
且后邊的靜態(tài)資源、后端接口通過http和https兩種協(xié)議訪問都正常。
4、關(guān)于nginx常用模塊和指令
Core 模塊:
http: 定義 HTTP 協(xié)議相關(guān)配置。
events: 配置事件驅(qū)動模型,如 epoll 和 kqueue。
server: 配置虛擬主機(jī)和服務(wù)器塊。
location: 配置請求的位置和 URI 匹配規(guī)則。
Http 模塊:
access: 控制請求的訪問權(quán)限。
gzip: 啟用 Gzip 壓縮以減小傳輸數(shù)據(jù)的大小。
ssl: 配置 SSL/TLS 相關(guān)設(shè)置,用于啟用 HTTPS。
rewrite: 重寫 URL,可以用于 URL 重定向和重寫。
Upstream 模塊:
Security 模塊:
http_auth_basic: 啟用 HTTP 基本認(rèn)證。
http_limit_req: 限制請求速率,用于防止 DDoS 攻擊。
http_limit_conn: 限制并發(fā)連接數(shù),保護(hù)服務(wù)器免受連接過載攻擊。
Logging 模塊:
access_log: 配置訪問日志的格式和路徑。
error_log: 配置錯誤日志的格式和路徑。
Mail 模塊:
mail: 支持郵件代理服務(wù)器功能,可用于配置電子郵件服務(wù)器。
imap: 支持 IMAP 協(xié)議。
smtp: 支持 SMTP 協(xié)議。
Third-party 模塊:
ngx_http_geoip_module: 提供地理位置信息,可用于區(qū)域限制和定位用戶。
ngx_pagespeed: 自動優(yōu)化 Web 頁面,提高性能。
ngx_lua: 提供 Lua 腳本支持,可用于高級定制和擴(kuò)展功能。
ngx_cache_purge: 提供緩存清除功能,用于手動清除代理緩存。
Stream 模塊:用于 TCP 和 UDP 代理,支持負(fù)載均衡。
stream: 配置 TCP/UDP 代理服務(wù)器。
upstream: 配置后端服務(wù)器池。
proxy: 配置反向代理設(shè)置。
到此這篇關(guān)于nginx將https協(xié)議反向代理到http協(xié)議請求上的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx https協(xié)議反向代理到http協(xié)議內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Linux下nginx配置https協(xié)議訪問的方法
- Nexus使用nginx代理實(shí)現(xiàn)支持HTTPS協(xié)議
- Nginx接收Http協(xié)議請求轉(zhuǎn)發(fā)使用Https協(xié)議的問題
- 如何實(shí)現(xiàn)Nginx同一端口同時支持http與https協(xié)議
- nginx將https協(xié)議反向代理到http協(xié)議請求上
- Nginx服務(wù)器配置https安全協(xié)議的實(shí)現(xiàn)
- Nginx內(nèi)網(wǎng)環(huán)境開啟https雙協(xié)議的實(shí)現(xiàn)
相關(guān)文章
Nginx0.5.33+PHP5.2.5(FastCGI)搭建勝過Apache10倍的Web服務(wù)器
Nginx 0.5.31 + PHP 5.2.4(FastCGI)搭建可承受3萬以上并發(fā)連接數(shù),勝過Apache 10倍的Web服務(wù)器的第2版,經(jīng)過了多臺服務(wù)器的測試。2009-10-10阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程)
這篇文章主要介紹了阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Nginx-rtmp實(shí)現(xiàn)直播媒體實(shí)時流效果
這篇文章主要介紹了Nginx-rtmp實(shí)現(xiàn)直播媒體實(shí)時流效果,文中給出了總體設(shè)計圖,為了整合平臺,會自建RTMP流媒體服務(wù)器和使用云廠商SaaS的RTMP流媒體服務(wù),需要的朋友可以參考下2018-08-08利用nginx和騰訊云免費(fèi)證書制作https的方法
這篇文章主要介紹了利用nginx和騰訊云免費(fèi)證書制作https的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11基于nginx實(shí)現(xiàn)上游服務(wù)器動態(tài)自動上下線無需reload的實(shí)現(xiàn)方法
這篇文章主要介紹了基于nginx實(shí)現(xiàn)上游服務(wù)器動態(tài)自動上下線無需reload,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02nginx實(shí)現(xiàn)動靜分離實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于nginx實(shí)現(xiàn)動靜分離實(shí)例講解,需要的朋友們可以參考下。2020-03-03NGINX?權(quán)限控制文件預(yù)覽和下載的實(shí)現(xiàn)原理
我們知道,使用nginx作為文件下載服務(wù)器,可以極大地降低對后端Java服務(wù)器的負(fù)載沖擊,但是nginx本身并不提供授權(quán)控制,這下該如何操作呢,下面小編給大家?guī)砹薔GINX?權(quán)限控制文件預(yù)覽和下載的實(shí)現(xiàn)原理,感興趣的朋友跟隨小編一起看看吧2022-01-01