私は、それぞれが5つのサイトを実行する2つの仮想ホスト(マルチテナント)を持っています。サーバーには3つのIPアドレスがあります。 2人は公表され、もう1人は社内である。ロードバランサを追加したときにDjangoマルチテナントサイトのリダイレクトループ
公開されているWebサイトにはいずれもSSL証明書があります。 1つのサイトは私のステージングサイトで、暗号化されたSSL証明書を持ち、もう1つはライブサイトであり、godaddy SSL証明書を持っています。
1つのノード(クラウドインスタンス)を持つRackspaceロードバランサを最初に設定し、証明書とキーをサーバーからコピーし、次のnginx設定を使用して、ロードバランサを使用して自分のサイトを余談として内部に向けIP
upstream django {
server unix:///run/uwsgi/app/introtest/socket;
}
# configuration of the server, first redirect http to https...
server {
listen 10.181.104.195:80;
if ($http_x_forwarded_proto = "http") {
return 302 https://$http_host$request_uri;
}
# the domain name it will serve for
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /srv/test/media;
}
location /static {
alias /srv/test/static;
}
# Finally, send all non-media requests to the Django server.
location/{
if (-f /srv/maintenance_test.html) {
return 503;
}
uwsgi_pass django;
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Host $server_name;
}
# Error pages
error_page 503 /maintenance_test.html;
location = /maintenance_test.html {
root /srv;
}
}
を務める私のWebサーバー、私はそれを助けることができれば永久的なリダイレクトを使用しないと、ステージングサーバーではなかったん。ライブサーバーは既に設定されており、httpsへの永続的なリダイレクトを行っていましたが、ライブサイトを常にSSLにリダイレクトしたいので、リダイレクトは301になります。
私のルートドメインロードバランサにサイトをステージングすると、これは正常に機能しました。
tail -f /var/log/nginx/access.log
は、ロードバランサの内部IPアドレスから要求が送信され、ページが正しく配信されていることを示しています。
私はすべてを元に戻しました(つまり、nginx confとステージングルートドメインのDNSエントリです)、ウェブサーバーから提供される準備が整っています。次に、godaddy SSL証明書情報をロードバランサにコピーしました。そして、ライブサーバーに対して次のnginxの構成で:
upstream intro_live {
server unix:///run/uwsgi/app/introsites/socket;
}
server {
listen <SERVER PUBLIC IP>:80;
listen <SERVER PUBLIC IP>:443;
location/{
return 503;
}
error_page 503 /interruption.html;
location = /interruption.html {
root /srv;
}
}
# configuration of the server
server {
# the port your site will be served on
listen 10.181.104.195:80;
# reidrect http to https from load balancer
if ($http_x_forwarded_proto = "http") {
set $http_test S${http_host};
}
if ($http_test = 'Sintrotravel.com') {
rewrite^https://www.introtravel.com$request_uri;
}
if ($http_test = 'Sozintro.com') {
rewrite^https://www.ozintro.com$request_uri permanent;
}
if ($http_test = 'Sbalintro.com') {
rewrite^https://www.balintro.com$request_uri permanent;
}
if ($http_test = 'Sthaintro.com') {
rewrite^https://www.thaintro.com$request_uri permanent;
}
if ($http_test = 'Svietnamintro.com') {
rewrite^https://www.vietnamintro.com$request_uri permanent;
}
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /srv/intro/media;
expires 7d;
add_header Pragma public;
add_header Cache-Control "public";
}
location /static {
alias /srv/intro/static;
expires 1d;
add_header Pragma public;
add_header Cache-Control "public";
}
# Finally, send all non-media requests to the Django server.
location/{
if (-f /srv/maintenance_on.html) {
return 503;
}
uwsgi_pass intro_live;
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Host $server_name;
}
# Error pages
error_page 503 /maintenance_on.html;
location = /maintenance_on.html {
root /srv;
}
}
- 最初
upstream django
ポイント私のuwsgi設定します。 - 2番目のサーバーの設定は、サーバーのパブリックアドレスにリッスンします。そのため、ユーザーのWebサイトのDNSエントリが更新されていない場合、サーバーがメンテナンス中であることを示す静的ページが表示されます。
- 第3のサーバー構成は、内部アドレスのポート80をリッスンし、ステージングサーバーが
http_x_forwarded_proto
に設定されているかどうかを確認し、ドメインにテスト変数を設定しているかどうかを確認します。私は特に、5つのサイトからのhttpトラフィックをhttpsにリダイレクトします。 - 最後の503件のファイルはファイルの存在を検出し、存在する場合は保守モードになります。
あり/etc/nginx/conf.d/には何もありませんし、私の/etc/nginx/nginx.confは次のようになります。私は5のためのDNSのAレコードを設定すると
user www-data;
worker_processes 20;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
サイトがロードバランサを指すようにするには、httpsへのリダイレクトは問題ありませんが、各ページでリダイレクトループが発生します。ですから、設定からすべてのリダイレクトを取り出しました。つまり、
if ($http_test = 'Sintrotravel.com') {
rewrite^https://www.introtravel.com$request_uri;
}
if ($http_test = 'Sozintro.com') {
rewrite^https://www.ozintro.com$request_uri permanent;
}
if ($http_test = 'Sbalintro.com') {
rewrite^https://www.balintro.com$request_uri permanent;
}
if ($http_test = 'Sthaintro.com') {
rewrite^https://www.thaintro.com$request_uri permanent;
}
if ($http_test = 'Svietnamintro.com') {
rewrite^https://www.vietnamintro.com$request_uri permanent;
}
とnginxを再起動しました。私はまだリダイレクトループを持っていました。なぜ???私は書き換えが永久的だと理解していますが、これはreturn 302
とrewrite
の違いではありません。すべてリダイレクトを取ると、サーバーはまだ無限リダイレクトループになっています。私は明らかな理由のためにライブサイトを実験するのに多くの時間を費やすことはできません。本当に私は10-15分で横断する必要があります誰でも助言がありますか?
このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 17677422) –