Nginx

2023 年 6 月 14 日 改訂

Nginex (エンジンエックス) は、web サーバーです。

 

Nginx ファイルとディレクトリ

$ sudo nginx -t

Nginx ファイルに構文エラーがないことをテストする。

$ sudo systemctl restart nginx

構文にエラーがなければ、Nginx を再起動して変更を有効にする。

/etc/nginx

Nginx 設定ディレクトリ。

/etc/nginx/nginx.conf

Nginx のメイン設定ファイル。Nginx のグローバル設定を変更できる。

/etc/nginx/sites-available/

サイトごとのサーバーブロックを保存できるディレクトリ。Nginx では、ここに保存されている設定ファイルが、site-enabled ディレクトリ内部からリンクされている必要がある。通常、サーバーブロック設定はこのディレクトリで行われ、他のディレクトリ (site-enabled ディレクトリ?) にリンクすることで有効になる。

/etc/nginx/sites-enabled/

有効なサイトごとのサーバーブロックが保存されるディレクトリ。sites-avaiable ディレクトリにある設定ファイルへのリンクが保存されている。

/var/log/nginx/access.log

Web サーバーにきたリクエストのログファイル。

/var/log/nginx/error.log

Nginx エラーのログファイル。

 

インストール

Ubuntu 20.04 に Nginx をインストールする方法

1) インストール、2) ファイアウォールの調整、3) Nginxプロセスの管理、4) サーバーブロックをセットアップして単一のサーバーから複数のドメインをホストする方法、を紹介。

これでインストールできたのですが、

chown nginx:username html

と入力すると

chown: invalid user: ‘nginx:username’

と言われました。以下、id nginx コマンドに続く

Ubuntu 日本語フォーラム

id nginx と入力した際に、id: `nginx': no such user、と言われた時の対処法。これが正しいのか、まだ確認してないです。

エラー対策

ufw status が inactive の場合。こちらを参照しました。

$ sudo ufw status
Status: inactive

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

$ sudo ufw status
Status: active

To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
OpenSSH ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)

 

パブリックファイルの権現

以下を参照しました。ありがとうございます。
Qiita: nginx で 403 を回避するために、パブリックファイルの権現についておさらい

PHP や Python (Flask) を動かすのに nginx を使うと、403 エラーがよく出ます。このため、web サーバの権現についておさらいします。

ファイルの置き場は /var/www

/var/www 以下の所有者と権現

$ sudo chown $USER:www-data -R /var/www

$USER はサーバ管理者のユーザ名。www-data グループに使いするのが望ましいです。ww-data は、web サーバ実行時のポプラーなユーザ/グループ名。apache, nginx ともに、設定ファイルから実行時のユーザめいが変更可能です。使用する web サーバを意識したくないなら、www-data にしておくのが良いです。

デフォルトで www-data になっていることもあれば、apache, nginx であったり、アプリケーションに依存したユーザ名になっていることもあります。

グループ一覧と表の味方

$ cat /etc/group

ファイルは 644、ディレクトリは 755

セキュリティ上の理由から、web サーバには書き込み権現を与えないことが望ましいです。また www-dataユーザを web サーバ以外の用途に使うのも避けた方が良いです。

ベーシック認証設定方法

 

たとえば「http://www.example.com/」にある、「http://www.example.com/hoge/」といったURLにベーシック認証を掛けたい場合は、こちらを参照し、nginx の設定ファイル (/etc/nginx/sites-available/default) に以下を記述しまいた。「/」locationに設定を追加します。

location /hoge/ {
auth_basic "Basic Authentication";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}

こちらも参照してください。

CGI スクリプトを利用する

Nginx で CGI スクリプトを動かします。以下のサイトに従いました。

https://www.server-world.info/query?os=Ubuntu_20.04&p=nginx&f=6

(1) fastcgiを追加インストールします。

root@www:~# apt -y install fcgiwrap

(2) nginx の設定ファイル /etc/nginx/sites-enabled/default を編集します。

root@www:~# vi /etc/nginx/sites-enabled/default

以下、太字部分を追加します。

server {
listen 80 default_server;
....
location /cgi-bin/ {
gzip off;
root /home/xxxxxxxxx;
fastcgi_pass unix:/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

}

あるいは設定ファイル名が「fgiwrap.conf」であれば、以下の操作です。

root@www:~# vi /etc/nginx/fcgiwrap.conf

fcgiwrap.conf に以下を記述します。

# 新規作成
# 例として [/cgi-bin] 配下は CGI を有効にする
location /cgi-bin/ {
gzip off;
root /var/www;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

vi でdefault を開きます。

# 設定をしたいサイト定義の [server] セクション内に追記
root@www:~# vi /etc/nginx/sites-available/default

以下を記述します。

server {
.....
.....
include fcgiwrap.conf;
}

(3) テストスクリプトを作成します。

root@www:~# vi /var/www/cgi-bin/index.cgi

以下、index.cgi ファイルの中身です。

#!/usr/bin/python3

print("Content-type: text/html\n")
print("<html>\n<body>")
print("<div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">")
print("CGI Script Test Page")
print("</div>")
print("</body>\n</html>")

実行権限を与えます。

root@www:~# chmod 705 /var/www/cgi-bin/index.cgi

(4) fcgiwrap を起動し、nginx を再起動します。

root@www:~# systemctl enable fcgiwrap

sudo systemctl restart nginx

(5) ブラウザで動作確認します。

https://..../cgi-bin/index.cgi

 

http へのアクセスを https にリダイレクトする
設定ファイル (/etc/nginx/sites-enabled/default) にある、retunr 404 を太字に書き換えました。こちらを参照しました (2023 年 6 月)。

server {

if ($host = fish-evol.org) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80 default_server;
listen [::]:80 default_server;

server_name fish-evol.org;
#return 404; # managed by Certbot
return 301 https://fish-evol.org$request_uri; # managed manually
}

 

リンク

Quiita: nginx 変数の値を表示

add_header ディレクティブを使うと良い。

Nginx で Index of を表示させる

index ファイルがなかった時に、そのディレクトリ内のファイル一覧を自動表示する機能。

nginx で 403 を回避するために、パブリックファイルの権現についておさらい

www-data は、web サーバー実行時のポプラーなユーザー/グループ名。apache, nginx ともに設定ファイルから実行時のユーザー名が変更できる。使用する web サーバーを意識したくないなら、www-data にしておくのがベター。デフォルトでwww-data になっていることもあれば、apache, nginx などになっていることもある。

Python CGI on Nginx

Ubuntu, Nginx 環境で CGI プログラムを動かすチュートリアル。

Nginx: CGI スクリプトを利用する

 

主に、Ubuntu 20.04 に Nginx をインストールする方法を参考にしました。ありがとうございます。