近日筆者需要實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)的需求。要求很簡(jiǎn)單:將瀏覽器的請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)指定的域名,需要提供一個(gè)https端口并且把http端口轉(zhuǎn)發(fā)到https端口。由于筆者對(duì)nginx的認(rèn)知有限,因此磕磕絆絆研究了一陣,將結(jié)果寫(xiě)出來(lái),以供其他有類似需求的同學(xué)參考對(duì)照。
1. 使用docker拉起nginx服務(wù)
nginx的官方docker在這里。拉起nginx就一個(gè)命令:
sudo docker run -d -v /home/linmao/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/linmao/nginx/cert:/cert/ -p 8000:80 -p 4443:443 nginx
這里解釋一下幾個(gè)參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
-v /home/linmao/nginx/nginx.conf:/etc/nginx/nginx.conf | nginx 的配置文件 |
-v /home/linmao/nginx/cert:/cert/ | 適配https端的密鑰 |
-p 8000:80 | 把本機(jī)的8000端口映射到nginx的http端口80 |
-p 4443:443 | 把本機(jī)的4443端口映射到nginx的https端443 |
2. 自簽https證書(shū)
上邊用到了https端點(diǎn),需要用到ssl證書(shū),到阿里云買(mǎi)一個(gè)證書(shū)要一年幾百塊,所以自己簽一個(gè),要多少有多少,缺點(diǎn)就是瀏覽器一看這證書(shū)感覺(jué)沒(méi)什么權(quán)威性,會(huì)讓用戶先進(jìn)一個(gè)安全警告頁(yè)面。不過(guò)先湊合用著吧。下邊的方法是筆者見(jiàn)過(guò)的最快生成證書(shū)的方法(僅需兩個(gè)命令)。
首先,生成一個(gè)根密鑰和csr,根據(jù)提示填寫(xiě)相應(yīng)的信息:
$ openssl req -newkey rsa:2048 -nodes -keyout self_key.pem -out self_csr.pem
Generating a RSA private key
................................................+++++
.............................+++++
writing new private key to 'self_key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Guangdong
Locality Name (eg, city) []:guangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:haha
Organizational Unit Name (eg, section) []:haha
Common Name (e.g. server FQDN or YOUR name) []:haha
Email Address []:haha@haha.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ ls
self_csr.pem self_key.pem
接著給csr簽名:
$ openssl x509 -signkey self_key.pem -in self_csr.pem -req -days 365 -out self_cert.pem
Signature ok
subject=C = CN, ST = Guangdong, L = guangzhou, O = haha, OU = haha, CN = haha, emailAddress = haha@haha.com
Getting Private key
$ ls
self_cert.pem self_csr.pem self_key.pem
根密鑰就是self_key.pem,證書(shū)就是self_cert.pem,這兩個(gè)要映射到nginx容器里給https端口使用,那個(gè)self_csr.pem可以扔了。
3. nginx配置文件
nginx.conf
work_processes 1;
events {
worker_connections 64;
}
http {
# 提供一個(gè)http端口
server {
# 監(jiān)聽(tīng)80端口
listen 80;
# 重定向到https端口,這個(gè)操作會(huì)引起瀏覽器地址變成localhost,
# 但因?yàn)槲覀兒筮吿峁┝薶ttps端口,因此并不會(huì)引起瀏覽器真的去請(qǐng)求localhost。
rewrite ^(.*) https://localhost$1 permanent;
}
# 提供一個(gè)https端口
server {
# 監(jiān)聽(tīng)443端口,注意后邊要加ssl
listen 443 ssl;
# 設(shè)置https所需的密鑰
ssl_certificate /cert/self_cert.pem;
ssl_certificate_key /cert/self_cert_key.pem;
# 設(shè)置一個(gè)后端,可根據(jù)uri匹配不同的后端
# uri匹配規(guī)則 ~ /(.*)$
# ~: 以正則表達(dá)式進(jìn)行匹配。
# ^/(.*)$: 匹配的正則表達(dá)式,匹配uri中的/xxxxxx。uri中后邊這一段xxxxx可以通過(guò)$1獲取。
location ~ ^/(.*)$ {
# 把流量轉(zhuǎn)發(fā)到https://www.baidu.com/xxxxx。
proxy_pass https://www.baidu.com/$1;
# 后邊這些配置可避免觸發(fā)重定向,全都要寫(xiě)。
proxy_redirect off;
# 使用proxy_set_header可以修改請(qǐng)求頭,nginx提供一些變量可以使用。
# $scheme:客戶端請(qǐng)求nginx時(shí)使用的協(xié)議,可為http或https。
# $host: 客戶端請(qǐng)求nginx時(shí)使用的ip地址或域名,取決于客戶端通過(guò)ip還是域名發(fā)請(qǐng)求給nginx。
# $port: 客戶端請(qǐng)求nginx時(shí)使用的端口。
# $http_host: 等同于$host:$port
# $proxy_host: 目標(biāo)服務(wù)器,有些上游服務(wù)器會(huì)檢查該頭,把Host頭改為$proxy_host可以避免觸發(fā)一些安全機(jī)制。
proxy_set_header Host $proxy_host;
# $remote_addr:客戶端ip地址或者上一個(gè)nginx的ip地址(如果請(qǐng)求是由nginx轉(zhuǎn)發(fā)過(guò)來(lái)的)。
proxy_set_header X-Real-IP $remote_addr;
# $proxy_add_x_forwarded_for: 與X-Forwarded-For配合使用,
# 相當(dāng)于把X-Forwarded-For中的內(nèi)容再加上$remote_addr,形成一個(gè)跳轉(zhuǎn)鏈。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
更多的nginx變量可以參考這里。啟動(dòng)之后就可以愉快地玩耍了。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-478802.html
999. Nginx踩坑記錄
下邊記錄筆者爬出來(lái)的坑。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-478802.html
- 關(guān)閉nginx容器之后,再次啟動(dòng),原來(lái)宿主機(jī)映射的端口失效的問(wèn)題解決
- 。。。
到了這里,關(guān)于使用nginx提供https端點(diǎn),實(shí)現(xiàn)不修改瀏覽器地址(不觸發(fā)重定向)轉(zhuǎn)發(fā)網(wǎng)絡(luò)流量,附生成自簽ssl證書(shū)最簡(jiǎn)單的方法(2個(gè)命令)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!