序言
當不再滿足使用域名+端口號訪問一台服務器上不同項目時,我決定研究下如何實現二級域名方式訪問。網上當然教程很多,但是我還是踩了不少坑,在此記錄一下。
准備工作
按照官網的做法,安裝EPEL等,有很多東西都是自帶的,所以有可以跳過
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
yum install certbot python2-certbot-nginx
或者更簡單,直接執行docker命令
docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot certonly -d *.futatsu.fun -d futatsu.fun --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
生成證書掛載進nginx
certbot certonly --standalone --email nsyk46@gmail.com -d *.futatsu.fun -d futatsu.fun
中間會要求你添加一條TXT記錄在域名解析中,去添加。
主機記錄 | 記錄類型 | 線路類型 | 記錄值 |
---|---|---|---|
_acme-challenge | TXT | 默認 | (certbot生成) |
此時默認證書會生成在 '/etc/letsencrypt/live/你的域名/' 下,你可以選擇重新掛載nginx把這個目錄掛載進去,也可以手動cp,推薦重新掛載,這樣將來更新證書時很方便。
設置二級域名
現在我希望把管理docker容器的portainer使用二級域名方式訪問,即直接訪問https://portainer.futatsu.fun,不需要訪問9000端口,以下是設置
server {
listen 80;
listen 443 ssl;
server_name portainer.futatsu.fun;
# old certs
# ssl_certificate /cert/1_www.futatsu.fun_bundle.crt;
# ssl_certificate_key /cert/2_www.futatsu.fun.key;
ssl_certificate /cert/fullchain.pem;
ssl_certificate_key /cert/privkey.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;
location / {
proxy_pass https://futatsu.fun:9000;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
同時又希望通過https://csv.futatsu.fun 訪問csv轉json工具
只需再配一個server即可,很簡單。
#csv
server {
listen 80;
listen 443 ssl;
server_name csv.futatsu.fun;
ssl_certificate /cert/fullchain.pem;
ssl_certificate_key /cert/privkey.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;
location / {
root /usr/share/nginx/html/uploadcsv;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
踩坑點
在設置http跳轉https時,我遇到了坑點,我訪問http://crv.futatsu.fun/abc,跳轉成為https://crv.futatsu.fun/abcabc,原因如下。
#設置跳轉時,不應該判斷是否訪問80端口,而應該判斷是否scheme為https,否則會造成一次循環導致request_uri被添加兩次。
#原來寫法
if ($server_port = 80) {
rewrite 301 https://$host$request_uri;
}
#現在寫法
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
目前面臨問題
因為我是在域名解析-主機記錄中,直接添加泛解析*,導致目前未被攔截的請求都會解析到主頁上去,比如a.futatsu.fun相當於直接訪問futatsu.fun。
解決方案1. 不適用泛解析,應該解析二級域名,這樣其他直接沒有解析即可,但是我不喜歡這樣
接下來想做 訪問不存在的二級域名,跳轉到404頁面。