FlatIsleロゴ

Flat Isle 日誌

nginx によるWEBサーバーの構築

2022-07-08

Raspberry PiをWEBサーバーとして運用できるように「nginx」をセットアップしていきます
なお、セキュリティ対策としてBASIC認証を導入していきます
64bit版での動作も確認完了しています

インストール

nginxをインストールします
下表を参考に、必要に応じた機能をインストールしてください

sudo apt install -y nginx php-fpm apache2-utils
パッケージ名必須説明
nginxnginx本体
php-fpmPHP(FPM-CGI binary)
mariadb-client mariadb-server php-mysqlMariaDB関連(データベース)
apache2-utilsウェブサーバ用ユーティリティプログラム
(BASIC認証作成に使用)

nginxの設定

nginxの設定ファイルは、「/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;
}

http {

	##
	# Basic Settings
	##

(中略)
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
(中略)
	##
	# Virtual Host Configs
	##

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

以上より、nginx.confを直接編集せず、必要なサービスの設定ファイルを「/etc/nginx/site-enabled/」の中に作成し、自動読込みで起動するように設定します
また、ブラウザがSSL通信を推奨していますので、自己証明書を作成しSSL通信のテストも併せて行います

自己証明書の作成

自己証明書(通称 オレオレ証明書)を下記のコマンドにて作成します

sudo mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
sudo openssl req -new \
	-x509 -out server.crt \
	-newkey rsa:2048 -keyout server.key \
	-days 3650 -sha256 \
	-subj "/C=JP/CN=webserver" \
	-addext "subjectAltName = DNS:webserver, IP:192.168.1.100" \
	-nodes
sudo chmod a+r /etc/nginx/ssl/server.*

作成した自己証明書は、/etc/nginx/ssl/ の中に作成されます
上記コマンドは、PC名「webserver」、IPアドレスは「192.168.1.100」で記述しています
環境に合わせて適宜修正してください

BASIC認証(パスワードファイルの作成)

接続するユーザー制限が出来るように、認証システムも導入します
以下のコマンドにて、ユーザー、パスワード設定ファイルを作成します
実行の為には、「apache2-utils」をインストールしておいてください

sudo htpasswd -c /etc/nginx/.htpasswd [ユーザー名]
    New password:[パスワード]
    Re-type new password:[パスワード]

設定ファイルの作成

エディタを起動し、サービス用のファイルを記述していきます

sudo nano /etc/nginx/sites-enabled/site1

以下の内容を記述します

upstream php {
	server unix:/var/run/php/php7.4-fpm.sock;
	server 127.0.0.1:9000;
}

server {
	listen 80;
	server_name webserver;
	return 301 https://$host/logout.html;
}

server {
	listen 443 ssl http2;
	server_name webserver;

	ssl_certificate /etc/nginx/ssl/server.crt;
	ssl_certificate_key /etc/nginx/ssl/server.key;
	ssl_session_cache shared:SSL:10m;
	add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

	root /var/www;
	index index.php index.html;

	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}
	location ^~ /private/ {
		auth_basic "closed site";
		auth_basic_user_file /etc/nginx/.htpasswd;
		location ~ \.php$ {
			include fastcgi_params;
			fastcgi_intercept_errors on;
			fastcgi_pass php;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		}
	}
	location / {
		satisfy any;
		allow all;
		root /var/www/html;
		location ~ \.php$ {
			include fastcgi_params;
			fastcgi_intercept_errors on;
			fastcgi_pass php;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		}
	}
	location /logout.html {
		return 401;
	}
}

【解説】

upstream php { … }php実行処理
server { … }WEBサービスの単位
listenWEBサービスの対応ポート番号
server_nameアクセス名(例では、自己証明書作成時に指定した「webserver」)
ssl_certificate,
ssl_certificate_key
証明書の指定
location ^~ /private/ { … }BASIC認証(アクセス時、ログイン処理を求められる)
本例では、/var/www/private/以下のページにログイン画面が表示されます
auth_basic…BASIC認証の設定
location ~ .php$ { … }PHP設定(上記「upstream」を呼び出します)
location / { … }ルートフォルダ用設定
(「satisfy any、allow all」でBASIC認証は不要となります)
location /logout.htmlBASIC認証のログアウト処理

設定ファイルの検証

nginx -t

nginxサービスの再起動

sudo systemctl restart nginx

Let’s Encrypt による証明書の作成

予め、ダイナミックDNS等によるアドレスの取得と、ルーター等よりポート開放を行い、外部(インターネット)からアクセスできるようにしておく必要があります
以下のコマンドで作成します

sudo apt install -y snapd
sudo snap install core
# "/etc/ld.so.preload cannot be preloaded"のエラーが出る場合
#   sudo nano /etc/ld.so.preload
#       #/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so    ←コメントアウトします
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx
  Which names would you like to activate HTTPS for?
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1: xxxxx.xx.xx
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  blank to select all options shown (Enter 'c' to cancel): 1      ←上記有効にするHTTPSサーバーを選択します
(中略)
  Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2  ←HTTPSにリダイレクトさせます
(後略)