Amazon Linux 2023 Section 3 nginx + PostgreSQL + PHP 構成
Section 3.2 nginx
About
Webアプリケーションを作るために……という事でWebサーバー構築を行っていきます。 ここでは、nginx(https://nginx.org/)を用いたWebサーバーとして構築します。
環境は、Section 3.1 が終わった状態からとなります。
バージョンを調べる
パッケージの配信状態を確認します。
[root@localhost ~]# dnf search nginx
================================================= 名前 完全一致: nginx =================================================
nginx.x86_64 : A high performance web server and reverse proxy server
=============================================== 名前 & 概要 一致: nginx ================================================
collectd-nginx.x86_64 : Nginx plugin for collectd
nginx-all-modules.noarch : A meta package that installs all available Nginx modules
nginx-core.x86_64 : nginx minimal core
nginx-filesystem.noarch : The basic directory layout for the Nginx server
nginx-mimetypes.noarch : MIME type mappings for nginx
nginx-mod-devel.x86_64 : Nginx module development files
nginx-mod-http-image-filter.x86_64 : Nginx HTTP image filter module
nginx-mod-http-perl.x86_64 : Nginx HTTP perl module
nginx-mod-http-xslt-filter.x86_64 : Nginx XSLT module
nginx-mod-mail.x86_64 : Nginx mail modules
nginx-mod-njs.x86_64 : NGINX JavaScript (njs) dynamic modules for nginx
nginx-mod-stream.x86_64 : Nginx stream modules
python3-certbot-nginx.noarch : The nginx plugin for certbot
=================================================== 名前 一致: nginx ===================================================
nginx-mod-headers-more.x86_64 : This module allows adding, setting, or clearing specified input/output headers
[root@localhost ~]#
特にバージョン管理されていなさそうです。
インストール
[root@localhost ~]# dnf -y install nginx
依存関係が解決しました。
========================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
========================================================================================================================
インストール:
nginx x86_64 1:1.30.4-1.amzn2023.0.1 amazonlinux 34 k
依存関係のインストール:
generic-logos-httpd noarch 18.0.0-12.amzn2023.0.3 amazonlinux 19 k
gperftools-libs x86_64 2.9.1-1.amzn2023.0.3 amazonlinux 308 k
libunwind x86_64 1.4.0-5.amzn2023.0.3 amazonlinux 66 k
nginx-core x86_64 1:1.30.4-1.amzn2023.0.1 amazonlinux 711 k
nginx-filesystem noarch 1:1.30.4-1.amzn2023.0.1 amazonlinux 10 k
nginx-mimetypes noarch 2.1.49-3.amzn2023.0.3 amazonlinux 21 k
トランザクションの概要
========================================================================================================================
インストール 7 パッケージ
(中略)
完了しました!
[root@localhost ~]#
インストール完了。
サービスの登録
サービスを有効化して起動します。
[root@localhost ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/syst//system/nginx.service.
[root@localhost ~]# systemctl start nginx
OSのFirewallがないのでポートは開いていますが、仮想マシン側は閉じたままです。
ホストマシンのブラウザからアクセスするためには、Vagrantfile の forwarded port の設定を変える必要があります。
1024より小さいポートにマッピングすると Vagrant up 中に警告が出ますが、複数起動したり、ホストマシンでWebサーバーを起動しなければ問題はないでしょう。
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "forwarded_port", guest: 443, host: 443
設定を修正後に、仮想マシンを再起動すれば、ネットワーク的に問題が無ければブラウザでアクセスできると思います。
document root を変更する
document root は /usr/share/nginx/html になっていますが、FHSを知っていたりすると、いろいろ思うところがあるので、apache を使う場合と同様に /var/www/html にファイルを置くように変更します。
FHS (Filesystem Hierarchy Standar) とは
Filesystem Hierarchy Standar(FHS)は、Linuxを含むUnix系OSでの主なディレクトリとその内容を定めたものです。
Filesystem Hierarchy Standard - Wikipedia
Amazon Linuxは、RHEL(Redhat Enterprise Linux)をベースにしているのでFHSに準拠している……ように感じられるのでそれに沿ってファイルを配置したほうが良いということになります。 FHS的には /usr 下はあまり変わらないもの。内容がちょいちょい変わるようなら /var 下という感じになっています。Webページが固定されることはないということを考えれば、/var 下だろうということで変更したいということです。
まずは、nginx.conf をsedで編集します。
[root@localhost ~]# cp --preserve=context /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
[root@localhost ~]# cat /etc/nginx/nginx.conf.org \
| sed -E "s/(^[ ]+root[ ]+)\/usr.*$/\1\/var\/www\/html;/" \
> /etc/nginx/nginx.conf
[root@localhost ~]#
document root を変更したので、diff で確認します。
[root@localhost ~]# diff -cT /etc/nginx/nginx.conf.org /etc/nginx/nginx.conf
*** /etc/nginx/nginx.conf.org YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /etc/nginx/nginx.conf YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 38,44 ****
listen 80;
listen [::]:80;
server_name _;
! root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
--- 38,44 ----
listen 80;
listen [::]:80;
server_name _;
! root /var/www/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
フォルダの作成
フォルダが存在していないと思うので作成して、権限を変更します。
[root@localhost ~]# mkdir -p /var/www/html
[root@localhost ~]# chown nginx:nginx /var/www/html
気にしなくてもよい話ではあるけれど、このままだと、SELinuxコンテキストが異なり、enforceモードになった場合にパーミッションエラーになってしまうので、それも変更します。
コピーやディレクトリ作成しただけだと、var_t になってしまいます。これを Webサービスから変えようと思うと、httpd_sys_content_t にする必要があります。変更はいろいろな手段がありますが、もともとOS設定で /var/www のコンテキストは登録済みなので、restorecon を使用して復元するという方法で変更します。ついでに、他とユーザー部分が異なるのも気持ちが悪いので合わせます。
[root@localhost ~]# ls -laZ /var/www/
total 4
drwxr-xr-x. 3 root root unconfined_u:object_r:var_t:s0 18 MMM dd hh:mm .
drwxr-xr-x. 20 root root system_u:object_r:var_t:s0 4096 MMM dd hh:mm ..
drwxr-xr-x. 2 nginx nginx unconfined_u:object_r:var_t:s0 6 MMM dd hh:mm html
[root@localhost ~]# restorecon -v -r /var/www
Relabeled /var/www from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /var/www/html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@localhost ~]# chcon -R -v -u system_u /var/www
'/var/www/html' のセキュリティコンテキストを変更しています
'/var/www' のセキュリティコンテキストを変更しています
[root@localhost ~]# ls -laZ /var/www
total 4
drwxr-xr-x. 3 root root system_u:object_r:httpd_sys_content_t:s0 18 MMM dd hh:mm .
drwxr-xr-x. 20 root root system_u:object_r:var_t:s0 4096 MMM dd hh:mm ..
drwxr-xr-x. 2 nginx nginx system_u:object_r:httpd_sys_content_t:s0 6 MMM dd hh:mm html
[root@localhost ~]#
動作を確認していきましょう。
サービス再起動
サービスを再起動してブラウザで確認します。
[root@localhost ~]# systemctl stop nginx
[root@localhost ~]# systemctl start nginx
/var/www/html の中身が空っぽなので、よく見るかもしれない「403 Forbidden」が表示されるだけだと思います。 まずは設定完了という事で。
コンテンツ配置とSELinux
SELinuxは Permissive 設定なので影響はないのですが、有効にした場合のことも考えて次のことだけ押さえておきましょう。
コンテンツ類は基本的に、/var/www/html にファイルを配置するわけですが、コンテキストが異なっていると Permission error になります。 どこにどういうコンテキストが適応されるかという標準設定は /etc/selinux/targeted/contexts/files/file_contexts に記載されているので、www あたりで検索すれば標準ならどのように配置するかがわかります。
作業しているうちにラベルが変わってしまう、適切なものでなくなっていくので、適切なタイミングで restorecon を使用してコンテキストをOS標準の状態に復元するのが簡単な方法で正しいやり方となります。
[root@localhost ~]# restorecon -v -r /var/www/html
Relabeled /var/www/html/******* from unconfined_u:object_r:admin_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
(略)
[root@localhost ~]#
なお、FTP/SFTPでアップロードする場合はアップロード場所に合わせた適切なラベルがつくので、気にしなくて済みます。 また、コピーすることでコピー先のラベルになるので、できるだけ移動 mv コマンドを使わず cp を使うのを推奨します。