我想知道如何配置 nginx 以使 2 個域在一臺服務器上作業(1 個 ip 地址)。我想在書架實體旁邊設定一個 Keycloak SSO。
我的問題是,當我想訪問 bookstack.domain.com 時,它會重定向到 keycloak.domain.com。
這是我的 /etc/nginx/conf.d/keycloak.conf :
upstream keycloak {
# Use IP Hash for session persistence
ip_hash;
# List of Keycloak servers
server 127.0.0.1:8080;
}
server {
listen 80;
server_name keycloak.domain.com;
# Redirect all HTTP to HTTPS
location / {
return 301 https://\$server_name\$request_uri;
}
}
server {
listen 443 ssl http2;
server_name keycloak.domain.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/certificate_key.key;
ssl_session_cache shared:SSL:1m;
ssl_prefer_server_ciphers on;
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://keycloak;
}
}
這是我的 /etc/nginx/conf.d/bookstack.conf :
server {
listen 3480;
access_log /var/log/nginx/bookstack_access.log;
error_log /var/log/nginx/bookstack_error.log;
server_name bookstack.domain.com;
root /var/www/bookstack/public;
#
# redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
#
return 301 https://$host$request_uri;
}
server {
listen 5443 ssl http2;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/certificate_key.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AE;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
server_name bookstack.domain.com;
#HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/bookstack/public;
access_log /var/log/nginx/bookstack_access.log;
error_log /var/log/nginx/bookstack_error.log;
client_max_body_size 1G;
fastcgi_buffers 64 4K;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
deny all;
}
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(. \.php)(/. )$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass unix:/var/run/php-fpm.sock;
}
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
expires 30d;
access_log off;
}
}
請告訴我 :)
uj5u.com熱心網友回復:
你的 keycloak 配置似乎沒問題
它監聽埠80 (http)和埠443 (https),所有請求80 (http)都被重定向到443 (https)
你的書架配置對我來說看起來不對勁它不監聽埠80or 443(而是監聽5443and 3480)。如果您沒有某種特殊的埠轉發,那么我認為請求bookstack.domain.com將永遠不會到達 nginx-server 中定義的,bookstack.conf因此唯一匹配的服務器將為請求提供服務 => keycloak
您應該更改bookstack.conf的偵聽埠:
server {
listen 80;
#... redirect to https
}
server {
listen 443 ssl;
#ssl config, webroot, ...
}
uj5u.com熱心網友回復:
這正是給定配置的預期 nginx 行為。對于到達某個 IP/埠組合的任何請求,無論HTTP 標頭值是什么,其中一個server塊始終充當默認服務器Host。這是有關此主題的官方檔案。您可以使用default_server該listen指令的引數來明確指定server應充當默認服務器的server塊,否則它將成為偵聽這些 IP/埠的第一個塊。在多宿主服務器上,事情可能會更復雜,正如這里所討論的。
現在回到問題。您的配置中有四個服務器塊:第一個偵聽 TCP 埠 80(http://方案的默認埠),第二個偵聽 TCP 埠 443(https://方案的默認埠),一個偵聽埠 3480,最后一個偵聽埠 5443 . 由于server每個埠只有一個塊偵聽,因此每個server塊都將充當到達該埠的任何請求的默認服務器。因此,如果您http://bookstack.domain.com在瀏覽器地址欄中鍵入,http://將使用方案的默認埠 80 ,您的請求將被重定向到https://keycloak.domain.com. 您正在使用
return 301 https://\$server_name\$request_uri;
用于重定向,并且$server_name變數將始終keycloak.domain.com用于該服務器塊(閱讀此答案以了解$host,$http_host和$server_name變數之間的區別)。如果您明確指定 port 和 type http://bookstack.domain.com:3480,您的請求將由第三個server塊提供服務,從而被重定向到https://bookstack.domain.com(這里您使用的$host是正確的變數)。默認的 TCP 埠https://方案是 443。但是server在該埠上偵聽的唯一塊是keycloak.domain.com! 哎呀。您可以訪問的唯一方法bookstack.domain.com是https://bookstack.domain.com:5443在瀏覽器中輸入。如果你正確理解了以上所有資訊,你也可以輸入https://keycloak.domain.com:5443,它不會有任何區別。
好吧,我試著用你的 nginx 配置解釋這里發生了什么。擺脫非標準埠,因為@Evil_skunk 在他的回答中建議你。在嘗試新配置之前不要忘記清除瀏覽器快取 - 與臨時 HTTP 302 重定向不同,永久 HTTP 301 重定向通常由瀏覽器快取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/312477.html
