ウェブサイト検索

Arch Linux の「Nginx Web サーバー」を使用して仮想ホスト、パスワード保護ディレクトリ、および SSL 証明書を作成する


前回の Arch Linux の「LEMP」記事では、ネットワーク サービス (Nginx、MySQL データベース、PhpMyAdmin) のインストールから、MySQL サーバーと PhpMyadmin に必要な最小限のセキュリティの構成まで、基本的な内容についてのみ説明しました。

このトピックは厳密に Arch Linux への以前の LEMP のインストールに関連しており、LEMP スタックのより複雑な構成、特に仮想ホスト の作成などのNginx Web サーバー構成の設定について説明します。 、パスワードで保護されたディレクトリ の使用、HTTP セキュア ソケット レイヤー の作成と構成、安全でない HTTP の HTTPS へのリダイレクト、また、いくつかの便利な Bash スクリプトも紹介します。仮想ホストをアクティブ化しSSL 証明書とキーを生成する作業が容易になります。

要件

Arch Linux に LEMP と MariaDB データベースをインストールする

ステップ 1: Nginx で仮想ホストを有効にする

仮想ホスト を有効にする最も簡単な方法の 1 つは、メインの Nginx 設定ファイルで include ステートメントを使用することです。これにより、単純なファイルを作成できるため、その後の設定作業がより簡単かつ効率的になります。新しいホストごとに実行し、メインの構成ファイルをクリーンな状態に保ちます。

このアプローチはApache Web サーバー の場合と同じように機能します。最初に行う必要があるのは、Nginx がファイル ディレクティブを読み取る新しいURI パスを指定することです。

1. そこで、/etc/nginx/ システム パスの一番下、最後の中括弧の前にある nginx.conf メイン ファイルを開きます。 }」は、将来の仮想ホスト構成ファイルが存在するパスを追加します。

sudo nano /etc/nginx/nginx.conf

最後に次のステートメントを追加します。

include /etc/nginx/sites-enabled/*.conf;

このディレクティブは、Nginx に、/etc/nginx/sites-enabled/ にある拡張子 .conf で終わるすべてのファイルを読み取るように指示します。

2. 次のステップは、sites-enabled ディレクトリと、すべての仮想ホスト構成を保存する sites-available というディレクトリを作成することです。ファイル。

sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. 次に、新しい仮想ホストを作成します。この例では、システム IP アドレスを仮想ホスト名として使用するため、name-ip.conf という名前の新しいファイルを作成します。

sudo nano /etc/nginx/sites-available/name-ip.conf

以下の内容を追加します。

## File content ##

server {
    listen 80;
    server_name 192.168.1.33;

    access_log /var/log/nginx/192.168.1.33.access.log;
    error_log /var/log/nginx/192.168.1.33.error.log;

    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }

    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

仮想ホストをアクティブにするディレクティブは、リスニング ポートの下の server_name ステートメントです。また、ここでのもう 1 つの重要なディレクティブは、Nginx 仮想ホストが /srv/http/ システム パスからファイル コンテンツを提供するように指示する root ステートメントです。

4. 最後のステップは、/srv/http/ ディレクトリを作成し、Nginx 読み取りで使用できる name-ip.conf ファイル構成を作成することです (シンボリック リンク)、デーモンを再起動して新しい構成を表示できるようにします。

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

5. これを確認するには、ブラウザで Arch システムの IP アドレスを指定すると、Web コンテンツが http://localhost とは異なることがわかります。ここでは、以下のスクリーンショットにあるように、FastCGI PHP 構成もチェックする小さな php スクリプトを追加しました。

sudo nano /srv/http/info.php
## File content ##

<?php
phpinfo();
?>

6. Nginx で仮想ホストを有効または無効にするために私が独自に開発したもう 1 つの方法は、より洗練されたもので、Apache a2eniste スクリプトからインスピレーションを得ています。

この方法を使用するには、ファイル エディタを開き、n2ensite という名前の新しいファイルを $HOME パスに以下の内容で作成し、実行可能にして root 権限で実行します。 .conf の末尾を付けずに、新しい仮想ホスト名にオプションとして渡します (必要に応じて自由に変更してください)。

sudo nano n2ensite
## File content ##

#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
                echo "Use script: n2ensite virtual_site"
                echo -e "\nAvailable virtual hosts:\n$site"
                exit 0
else

if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo  -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi

それを実行可能にして、show として実行します。

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. 仮想ホストを無効にするには、次の内容を含む新しい n2dissite ファイルを作成し、上記と同じ設定を適用します。

sudo nano n2dissite
## File content ##

#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
                echo "Use script: n2dissite virtual_site"
                echo -e "\nAvailable virtual hosts: \n$site"
                exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi

8. これで、この 2 つのスクリプトを使用して仮想ホストを有効または無効にすることができますが、システム全体のコマンドとして適用したい場合は、両方のスクリプトを /usr/local/bin/< にコピーするだけです。 とすると、パスを指定せずに使用できます。

sudo cp n2ensite n2dissite /usr/local/bin/

ステップ 2: Nginx 上の仮想ホストで SSL を有効にする

SSL (Secure Sockets Layer) は、ネットワークまたはインターネット上の HTTP 接続を暗号化するように設計されたプロトコルです。これにより、対称/非対称暗号キーを使用して安全なチャネル上でデータ フローが送信されます。 Arch Linux では OpenSSL パッケージによって提供されます。

sudo pacman -S openssl

9. Nginx との HTTPS 接続を有効にするには、まず仮想ホスト キーを生成する必要があります。また、作業を簡素化するために、仮想ホストの名前をキー名として使用して、/etc/nginx/ssl ディレクトリ パスに暗号キーを自動的に生成する小さなスクリプトを開発しました。

nginx_gen_ssl という名前のファイルを作成し、次の内容を追加します。

sudo nano nginx_gen_ssl
## File content ##

#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx  SSL certificate!"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0

10. スクリプトが作成されたら、実行権限を追加し、実行して証明書オプションを指定します。最も重要なのは共通名 フィールドです (ここに正式なドメイン名を追加します)。 「パスワード」フィールドと「オプションの会社」フィールドは空白のままにします。

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

キー生成タスクの最後に、Nginx ssl ディレクトリで使用可能なすべてのキーのリストが表示されます。

また、このスクリプトをシステム コマンドとして使用する場合は、それを /usr/local/bin/ にコピーまたは移動します。

sudo mv nginx_gen_ssl  /usr/local/bin

11. Nginx SSL 仮想ホストに必要なキーを生成したら、実際に SSL 仮想ホスト構成ファイルを作成します。 server_name ディレクティブで上記と同じ仮想ホストのシステム IP アドレスを使用しますが、このファイルがname-ip SSL 仮想ホストを表します。

sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf

このファイルで、ポート ステートメントを 443 ssl に変更リッスンし、以前に作成したものを使用して SSL および証明書キー ファイルのパスを指定し、以下の抜粋のようになります。

## File content ##

server {
    listen 443 ssl;
    server_name 192.168.1.33;

       ssl_certificate     /etc/nginx/ssl/192.168.1.33.crt;
       ssl_certificate_key  /etc/nginx/ssl/192.168.1.33.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

    access_log /var/log/nginx/192.168.1.33-ssl.access.log;
    error_log /var/log/nginx/192.168.1.33-ssl.error.log;
    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

12. ファイルが作成されたら、n2ensite スクリプトまたは ln コマンド ラインを使用してファイルをアクティブ化します (サイト内にファイルのシンボリック リンクが作成されます) -enabled ディレクトリ)、Nginx デーモンを再起動して設定を適用します。

sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

13. 再度ブラウザで Arch IP URL を指定しますが、今回は HTTPS プロトコル (私のシステムでは https://192.168.1.33) を使用します。 信頼できない接続 セキュリティ エラーが表示されます (セキュリティ例外の追加と確認 でページをさらに進めます)。

ご覧のとおり、Nginx 仮想ホストは前の name-ip ホストと同じコンテンツを提供しますが、今回は HTTP 安全な接続を使用します。

ステップ 3: 仮想ホスト経由で PhpMyAdmin にアクセスする

Nginx で仮想ホストが有効になっている場合、http://localhost パスのコンテンツにアクセスできなくなります (localhost は通常、ループバック IP アドレスまたはシステム IP アドレス (他の構成が設定されていない場合) を使用してコンテンツを提供します)。 Arch システムの IP を server_name として使用したため、コンテンツ パスが変更されました。

14. Web 経由で PhpMyAdmin にアクセスする最も簡単な方法は、/usr/share/webapps/phpMyAdmin/ パスの間にシンボリック リンクを作成することです。および新しく定義された仮想ホスト パス (/srv/http)。

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

15. 上記のコマンドを実行した後、ページを更新すると、autoindex ステートメントが Nginx 仮想ホストで有効になっている場合、または URL が直接ポイントされている場合、新しいフォルダ phpMyAdmin が表示されます。 PhpMyAdmin フォルダー https://arch_IP/phpMyAdmin

16. ブラウザ上の phpMyAdmin 文字列をサニタイズしたい場合は、仮想ホスト ファイルを編集し、サーバー ブロックの下に次のコンテンツを追加します。

location /phpmyadmin {
       rewrite ^/* /phpMyAdmin last;
    }

ステップ 4: Nginx でパスワードで保護されたディレクトリを有効にする

Apache とは異なり、Nginx は HttpAuthBasic モジュールを使用して パスワードで保護されたディレクトリ を有効にしますが、暗号化された .htpasswd ファイルを作成するツールは提供しません。

17. Arch Linux で Nginx を使用してディレクトリのパスワード保護を実現するには、Apache Web サーバーをインストールし、そのツールを使用して暗号化された .htaccess ファイルを生成します。

sudo pacman -S apache

18. Apache をインストールした後、/etc/nginx/ の下に直感的に passwd という名前の新しいディレクトリを作成し、.htpasswd ファイルを保存して使用します。 htpasswd コマンドで –c スイッチを指定すると、最初に追加されたユーザーがファイルを生成します。その後、さらにユーザーを追加する場合は、– を付けずに htpasswd を使用します。 cスイッチ。

sudo mkdir /etc/nginx/passwd

sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

19. name-ip-ssl 仮想ホストのルート /srv/http/ を保護するため、その下のすべてのサブ フォルダとファイルを含むパスが提供されます。ルート ディレクティブの下の仮想ホスト サーバー ブロック内に次の命令を追加し、.htpasswd ファイルの絶対パスを指定します。

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

20. Nginx サービスを再起動すると、ページが更新され、 資格情報を要求する認証が必要 ポップアップが表示されます。

これで、Nginx のパスワードで保護されたディレクトリ が正常に有効になりましたが、同時に Apache Web サーバーがシステムにインストールされることに注意してください。無効のままであることを確認し、絶対に起動しないでください。ポートが Nginx と競合しています。

ステップ 5: Nginx で HTTP を HTTPS にリダイレクトする

21. ブラウザがすべての安全でない HTTP リクエストを HTTPS プロトコルに自動的にリダイレクトするようにしたい場合は、非 SSL 仮想ホストを開いて編集し、 の下に次の指示を追加します。 >サーバー名ディレクティブ。

rewrite        ^ https://$server_name$request_uri? permanent;

この記事で紹介されている設定はすべて、 サーバーとして機能するArch Linux システムで行われていますが、そのほとんど、特に Nginx 構成ファイルに関する設定は、わずかな違いはありますが、ほとんどの Linux システムで利用できます。