情況是這樣,我在虛擬機(jī)上,使用docker跑前端,需要這個(gè)前端支持https,原h(huán)ttp的話自動(dòng)跳轉(zhuǎn)到https。另外,前端部署使用了負(fù)載均衡,即使用了3個(gè)docker跑前端:1個(gè)入口,另外2個(gè)是前端,指向了同一份網(wǎng)站代碼。(有關(guān)前端部署負(fù)載均衡,詳見拙作《使用docker部署多個(gè)nginx站點(diǎn)并配置負(fù)載均衡》)
如圖所示
有關(guān)使用docker部署nginx并支持https,之前我也有一篇總結(jié):《使用docker部署nginx并支持https》
現(xiàn)在要說的是,轉(zhuǎn)向https以后,原先的http方式怎么辦?現(xiàn)在https已經(jīng)是標(biāo)配了,http除了方便一點(diǎn),沒有什么好留戀的,最好的處理方式,不是同時(shí)支持兩種協(xié)議,而是將http自動(dòng)跳轉(zhuǎn)到https。其實(shí)跳轉(zhuǎn)很簡(jiǎn)單,只有2、3行代碼:
server {
listen 80;
server_name 192.168.0.22;
# rewrite ^/(.*) https://$server_name:8443$request_uri? permanent;
return 301 https://$host:8443$request_uri;
}
這是支持http的server配置。一般網(wǎng)上教程給的文章,沒有注明這個(gè)端口8443,是因?yàn)樗麄儧]有用虛擬機(jī)來部署。而我是在宿主機(jī)上跑了一個(gè)linux,然后在linux上再跑docker。其中192.168.0.22就是宿主機(jī),443早就被其他應(yīng)用占用了,我只能開放8443給外部訪問,所以跳轉(zhuǎn)這里加上了端口8443。
上面的跳轉(zhuǎn),有2條語句,任意一條都可以。這個(gè)server_name可不是隨意寫的。
我感覺最后一條比較簡(jiǎn)潔,第一條太多代碼了。permanent是“永久”的意思,估計(jì)是想告訴瀏覽器,你訪問的http地址,已經(jīng)永久轉(zhuǎn)向了這個(gè)啥啥啥。但其實(shí),301就代表了永久轉(zhuǎn)移:
HTTP 301 Moved Permanently 說明請(qǐng)求的資源已經(jīng)被移動(dòng)到了由Location 頭部指定的url 上,是固定的不會(huì)再改變。搜索引擎會(huì)根據(jù)該響應(yīng)修正。
前面說到,“$server_name“ 在腳本中被賦值,但是”$host"沒看到哪里有賦值,其實(shí)就是代表我們所訪問的地址,無須賦值。意思是,你訪問http://abc,系統(tǒng)就自動(dòng)給你跳到https://abc。這個(gè)abc,就是host。
另外,修改nginx腳本以后,除了需要重啟相關(guān)docker,還要將瀏覽器清除緩存,否則試不出效果。
負(fù)責(zé)跳轉(zhuǎn)的docker對(duì)應(yīng)的完整nginx配置腳本:文章來源:http://www.zghlxwxcb.cn/news/detail-521803.html
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream main-web{
server 192.168.144.129:8810;
server 192.168.144.129:8811;
}
server {
listen 443 ssl;
server_name localhost;
# 注意文件位置,是從/etc/nginx/下開始算起的
ssl_certificate cert/gdhysthj.crt;
ssl_certificate_key cert/gdhysthj.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 這里寫的是我的騰訊云內(nèi)網(wǎng)地址,不知道為啥,不能用127.0.0.1...
proxy_pass http://main-web;
}
}
server {
listen 80;
server_name 192.168.0.22;
# rewrite ^/(.*) https://$server_name:8443$request_uri? permanent;
return 301 https://$host:8443$request_uri;
}
}
192.168.144.129 是虛擬機(jī)地址,192.168.0.22是宿主機(jī)地址。文章來源地址http://www.zghlxwxcb.cn/news/detail-521803.html
到了這里,關(guān)于虛擬機(jī)上用docker + nginx跑前端并支持https和http的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!