これら 2 つの nginx ルールをマージして適切に動作させるにはどうすればよいですか?

これら 2 つの nginx ルールをマージして適切に動作させるにはどうすればよいですか?

以前は htaccess ルールを使用して Apache を実行していましたが、Discourse フォーラム ソフトウェアの docker インスタンスを実行する nginx に切り替えました。docker インスタンスの外部で nginx を実行し、proxypass を使用して domain.com/forum に配置しています。以前は、www. を除いた入力されたサブドメインを取得し、それを URL の末尾に追加するために、以下のように設定していました。サブドメインが指定されていない場合は、通常どおりに動作します。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} .example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/forum/t/%1$1 [L,NC,QSA]

htaccess から nginx へのコンバーターを使用した結果、次のようになりました。

location / {
  if ($http_host !~ "^www\."){
   rewrite ^(.*)$ http://example.com/forum/t/%1$1 redirect;
  }
}

現在の場所の設定は次のようになります。

location /forum {
    proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
   }
    fastcgi_read_timeout 60;
 }

私の質問は、if ステートメント内の変換されたコードを、proxy_pass を含む現在のコードとどのようにマージできるかということです。そのままそこに入れようとしましたが、ループになってしまいました。

ご意見をいただければ幸いです。ありがとうございます!

答え1

これが最終的にうまくいった方法です。特定のサブドメインに対して後からいくつか追加しましたが、実際にうまくいったのはこれです。

 server {
    server_name example.com www.example.com;
    listen ipaddress;

    root /home/me/public_html;
    index index.html index.htm index.php;
    access_log /var/log/virtualmin/example.com_access_log;
    error_log /var/log/virtualmin/example.com_error_log;
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE nginx;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param SCRIPT_FILENAME /home/me/public_html$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param REQUEST_URI $request_uri;
    fastcgi_param DOCUMENT_URI $document_uri;
    fastcgi_param DOCUMENT_ROOT /home/me/public_html;
    fastcgi_param SERVER_PROTOCOL $server_protocol;
    fastcgi_param REMOTE_ADDR $remote_addr;
    fastcgi_param REMOTE_PORT $remote_port;
    fastcgi_param SERVER_ADDR $server_addr;
    fastcgi_param SERVER_PORT $server_port;
    fastcgi_param SERVER_NAME $server_name;
    fastcgi_param HTTPS $https;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/php-nginx/15187383894597.sock/socket;
    }
    listen 443 ssl http2;  listen [::]:443 ssl http2;
    ssl_certificate /home/me/ssl.combined;
    ssl_certificate_key /home/me/ssl.key;
        http2_idle_timeout 5m; # up from 3m default

    location /forum {

        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
    fastcgi_read_timeout 60;
}

 # This server forwards requests from subdomains
 server {
  server_name ~^(.*)\.example\.com$;
   listen   ipaddress default_server;

  location / {
    return 301 https://example.com/forum/c/$1;
  }
}

次に、ランダムに特定のものをテストするために、これらのいくつかを追加しましたが、問題なく動作しました。

 # Test for specificsub
 server {
  server_name specificsub.example.com;
   listen   ipaddress;

  location / {
    return 301 https://example.com/forum/c/assets/specificsub;
  }
}

 # Test for specificsub2
 server {
  server_name specificsub2.example.com;
   listen   ipaddress;

  location / {
    return 301 https://example.com/forum/c/assets/specificsub2;
  }
}

答え2

このような方法で十分でしょう。このままではうまくいかないかもしれませんが、自分自身を成長させるための一般的な戦略は得られるはずです。誰かにこのすべてを行ってもらい、テストしてもらいたい場合は、コンサルタントを雇う必要があります。

サブドメインのセットは無制限にあると想定しています。

// This server serves only forum traffic on the main domain
server {
  server_name example.com;

  location /forum {
      proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
      proxy_set_header Host $http_host;
      // etc
   }

   // This should forward all requests to the forum subfolder
   location / {
     return 301 http://example.com/forum/;
   }

   // Insert any other required locations
 }

 // This server forwards requests from subdomains
 server {
  server_name ~^(.*)\.example\.com$;
  // If the line above doesn't work uncomment these two and try them instead. They basically listen to everything not specified explicitly.
  // listen       80  default_server;
  // server_name  _;

  location / {
    return 301 http://example.com/forum/t/$1;
  }
}

関連情報