web-dev-qa-db-ja.com

nginxでマスダイナミック仮想ホストをセットアップする方法は?

大量の動的仮想ホストをセットアップしようとして、nginxで約1時間遊んでいます。あなたがApacheでそれをしたことがあるなら、あなたは私が何を意味するか知っています。

目標は、オフィスにいる少数の人々(50人以上)のために動的なサブドメインを持つことです。

21
jM2.me

これをまとめるには、スクリプトに関する知識が必要です。私はPHPを使用しますが、bashスクリプトが得意な場合は、PHPを使用してください。私はこのようにします:

  1. まず、いくつかのフォルダーを作成します(/ usr/local/etc/nginx/domain.com /)。

  2. メインのnginx.confでコマンドを追加します:include /usr/local/etc/nginx/domain.com/*.conf;

  3. このフォルダー内のすべてのファイルは、異なる仮想ホスト名subdomain.confである必要があります。

設定がアクションを実行するためにnginxサーバーを再起動する必要はありません。リロードするだけで済みます:/ usr/local/etc/rc.d/nginx reload

または、すべてのvhostを設定する必要があるconfファイルを1つだけ作成できます。これはおそらく、nginxが50個のファイルをロードする必要がなく、1つだけをロードするのに適しています。

スクリプトに問題がある場合は、それについて質問してください...

15
Glavić

おそらくこれを行うことで、あなたがなりたい場所にたどり着くでしょう:

server {

    root /sites/$http_Host;

    server_name $http_Host;

    ...

}

文字通りその場でサイトを作成できるので、これが好きです。ドメインにちなんで名付けられた新しいディレクトリを作成し、DNSをサーバーのIPにポイントするだけです。

65
Hangster

後でpartlovによって編集されたuser2001260の回答に基づいて、これが私の結果です。

これは、ローカル仮想マシン上にある開発サーバー用であり、各ドメインの最後に.devプレフィックスが使用されていることに注意してください。それを削除したい場合、または他のものを使用したい場合は、\.devディレクティブのserver_name部分を編集するか、完全に削除することができます。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Match any server name with the format [subdomain.[.subdomain...]].domain.tld.dev
    server_name ~^(?<subdomain>([\w-]+\.)*)?(?<domain>[\w-]+\.[\w-]+)\.dev$;

    # Map by default to (projects_root_path)/(domain.tld)/www;
    set $rootdir "/var/www/$domain/www";

    # Check if a (projects_root_path)/(subdomain.)(domain.tld)/www directory exists
    if (-f "/var/www/$subdomain.$domain/www"){
        # in which case, set that directory as the root
        set $rootdir "/var/www/$subdomain.$domain/www";
    } 

    root $rootdir;

    index index.php index.html index.htm index.nginx-debian.html;

    # Front-controller pattern as recommended by the nginx docs
    location / {
        try_files $uri $uri/ /index.php;
    }

    # Standard php-fpm based on the default config below this point
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

}

server_nameの正規表現は、変数subdomainおよびdomainをキャプチャします。 subdomain部分はオプションであり、空にすることができます。デフォルトで、サブドメインがある場合、たとえばadmin.mysite.comルートがmysite.comと同じルートに設定されるように設定しました。このようにして、同じフロントコントローラー(私の場合はindex.php)がサブドメインに基づいてルーティングできます。ただし、まったく異なるアプリケーションをサブドメインに保持する場合は、admin.mysite.com dirを設定すると、そのディレクトリがadmin.mysite.comの呼び出しに使用されます。

注意:ifの使用は、リクエストごとに余分な処理オーバーヘッドが追加されるため、現在のnginxバージョンでは推奨されていませんが、開発環境での使用には問題ありません。この構成が何に適しているか。実稼働環境では、制御を強化してセキュリティを強化するために、大規模な仮想ホスト構成を使用せず、各サイトを個別に構成することをお勧めします。

7
Andri
server_name ~^(?<vhost>[^.]*)\.domain\.com$;
set $rootdir "/var/www/whatever/$vhost";
root $rootdir;
1
Samuurai

もう1つの方法は、ディレクトリを適切と思われるように分類できるように、数レベルの深さを含めることです。例えば:

include sites-enabled/*.conf;
include sites-enabled/*/*.conf;
include sites-enabled/*/*/*.conf;
include sites-enabled/*/*/*/*.conf;
0
yuvilio

@Samuuraiが提案したように、ここに短いバージョンAngular 5 with nginx build Integration:

server {
    server_name ~^(?<branch>.*)\.staging\.yourdomain\.com$;
    access_log /var/log/nginx/branch-access.log;
    error_log /var/log/nginx/branch-error.log;
    index index.html;
    try_files $uri$args $uri$args/ $uri $uri/ /index.html =404;
    root /usr/share/nginx/html/www/theft/$branch/dist;
}
0
Kristiqn Tachev