Nginx

2023 年 6 月 14 日 改訂

Nginx (エンジンエックス) は、web サーバーソフトウェアです。HTTP リスエストを送った時に、何かしらのレスポンスを返すプログラムです。同じ web サーバーソフトウェアである Apache より、高速で高負担に強いです。

 

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

nginx デフォルトのドキュメントルートは

/usr/share/nginx_html

になっているそうです。ここに作成した html ファイルを設置すると、ソフトウェアアップグレード時に邪魔になる可能性があるそうです。このため、apached と同じように、

/var/www

以下に設置した方が良いようです。

 

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

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

$USER はサーバ管理者のユーザ名です。root をそのまま使っていると問題になるので、別にユーザー名を作成し、www-data グループに追加します。

www-data

以下、Qiita より抜粋。
www-data は Ubuntu 上の Web サーバー (Apache, nginx など) がデフォルトで通常の操作に使用するユーザーです。Web サーバープロセスは、www-data がアクセスできる全てのファイルにアクセスできます。Web サーバーによって書き出されたデータは、www-data が所有します。CentOS だと apache ユーザーです。

$ head /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}
....

グループ一覧と表

$ cat /etc/group

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

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


ベーシック認証の設定方法

ベーシック認証とは、サイトのアクセス時にアクセスを制限を行うために、IDとPasswordを用いた認証のことです。

たとえば「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;
}

Nginxにてベーシック(Basic)認証を有効にする手順を参照しました。

 

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
}

 

uWSGI

uWSGI (ウエスギ) は、Python で Web サービスを動かすためのアプリケーションサーバーです。

osadm@tk2-211-15231:/etc/uwsgi/apps-available$ cat README
This is staging directory for uWSGI configuration files.

You should place configuration files here and create soft links to them in
/etc/uwsgi/apps-enabled directory.

See also /etc/uwsgi/apps-enabled/README.

osadm@tk2-211-15231:$ cat /etc/uwsgi/apps-enabled/README
Some files found in this directory are processed by uWSGI init.d script as
uWSGI configuration files.

On system boot for each configuration file new uWSGI daemon instance is started
with additional option. Name of this option is based on configuration file
extension. Path to configuration files is passed as option value.

See more detailed information at:
* /usr/share/doc/uwsgi/README.Debian.gz
* /etc/default/uwsgi

 

リンク

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 をインストールする方法を参考にしました。ありがとうございます。