Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nginxのmaster processをroot以外のユーザで起動してみる

Posted at

目次

#1.はじめに
#2.前提環境
#3.デフォルトの確認
#4.設定変更
#5.結果確認
#6.あとがき

1.はじめに

昨今セキュリティの要件が厳しくなってきており、基本的にはrootユーザは利用しない運用になっています。
サービスの起動ユーザについてもrootユーザが利用不可が要件となることもあるかと思い、nginxの起動ユーザの変更をしてみたので、自分用のメモとして残しておきます。

2.前提環境

Amazon Linux release 2023
nginx 1.22.1-1.amzn2023.0.3

3.デフォルトの確認

まずはnginxを導入してサービスを起動します。

$ sudo yum install nginx
$ sudo systemctl start nginx

デフォルトのプロセスを確認してみます。

$ ps -ef |grep nginx
root       25126       1  0 13:41 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      25127   25126  0 13:41 ?        00:00:00 nginx: worker process

workerプロセスはnginxユーザで起動していますが、master processについてはrootユーザで起動しています。

4.設定変更

今回はworker processと同様にmaster processについてもnginxユーザで起動してみようと思います。

・nginxの設定
起動ユーザを変更する都合上、権限についても気にする必要があります。
今回は/nginx_testというディレクトリを作成し、権限変更、設定の変更を行います。

$ sudo mkdir -p /nginx_test/conf
$ sudo mkdir -p /nginx_test/run
$ sudo mkdir -p /nginx_test/log 
$ sudo mkdir -p /nginx_test/html

confは定義ファイル用、runはpidファイル格納用、logはlogファイル格納用のディレクトリ、htmlはサンプルページ格納用のディレクトリです。

次にデフォルトの設定ファイルとサンプルページのhtmlファイルを今回作成したディレクトリにコピーし、ディレクトリの権限を変更します。
※検証なので777のnginx nginxに設定します

$ sudo cp -rp /etc/nginx/* /nginx_test/conf/
$ sudo cp -rp /usr/share/nginx/html/* /nginx_test/html/
$ sudo chown nginx:nginx /nginx_test/*
$ sudo chmod 777 /nginx_test/*

では設定ファイルの内容を今回の検証向けにコンバートしていきます。

変更点:

$ diff /nginx_test/conf/nginx.conf /nginx_test/conf/nginx.conf_bk 
7,8c7,8
< error_log /nginx_test/log/error.log notice;
< pid /nginx_test/run/nginx.pid;
---
> error_log /var/log/nginx/error.log notice;
> pid /run/nginx.pid;
11c11
< include /nginx_test/modules/*.conf;
---
> include /usr/share/nginx/modules/*.conf;
22c22
<     access_log  /nginx_test/log/access.log  main;
---
>     access_log  /var/log/nginx/access.log  main;
29c29
<     include             /nginx_test/conf/mime.types;
---
>     include             /etc/nginx/mime.types;
35c35
<     include /nginx_test/conf/conf.d/*.conf;
---
>     include /etc/nginx/conf.d/*.conf;
38,39c38,39
<         listen       9999;
<         listen       [::]:9999;
---
>         listen       80;
>         listen       [::]:80;
41c41
<         root        /nginx_test/html;
---
>         root         /usr/share/nginx/html;
44c44
<         include /nginx_test/conf/default.d/*.conf;
---
>         include /etc/nginx/default.d/*.conf;

変更後のファイル:

/nginx_test/conf/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /nginx_test/log/error.log notice;
pid /nginx_test/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /nginx_test/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /nginx_test/log/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /nginx_test/conf/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /nginx_test/conf/conf.d/*.conf;

    server {
        listen       9999;
        listen       [::]:9999;
        server_name  _;
        root        /nginx_test/html;

        # Load configuration files for the default server block.
        include /nginx_test/conf/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }

}

基本的にはファイルパスの変更のみを行いましたが、ポート番号については注意が必要です。

以下の記事によるとウェルノウンポート(0~1023番)を利用する場合はroot権限が必要となるので、今回はポート番号を9999に変更しています。

参考にさせていただいた記事:
Linux ポート番号の種類について(自分用メモ

・serviceファイルの設定変更
次にserviceファイルの変更を行います。

変更点:

$ diff /usr/lib/systemd/system/nginx.service /usr/lib/systemd/system/nginx.service_bk
8c8
< PIDFile=/nginx_test/run/nginx.pid
---
> PIDFile=/run/nginx.pid
12,14c12,14
< ExecStartPre=/usr/bin/rm -f /nginx_test/run/nginx.pid
< #ExecStartPre=/usr/sbin/nginx -t
< ExecStart=/usr/sbin/nginx -c /nginx_test/conf/nginx.conf
---
> ExecStartPre=/usr/bin/rm -f /run/nginx.pid
> ExecStartPre=/usr/sbin/nginx -t
> ExecStart=/usr/sbin/nginx
20,21d19
< User=nginx
< Group=nginx
/usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/nginx_test/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /nginx_test/run/nginx.pid
#ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx -c /nginx_test/conf/nginx.conf
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
User=nginx
Group=nginx

[Install]
WantedBy=multi-user.target

変更点は以下4点です。
-/nginx_testへのパス変更
-ExecStartPreの構文チェックをコメントアウト
-ExecStartで設定ファイルを個別に指定
-User,Groupにnginxの指定を追加

5.結果確認

serviceファイルを変更しているので、daemon-reloadした上でstop/startで再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl stop nginx
$ sudo systemctl start nginx

デフォルトを確認した時と同様にプロセスの起動ユーザを確認します。

$ ps -ef |grep nginx
nginx       5207       1  0 15:17 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /nginx_test/conf/nginx.conf
nginx       5208    5207  0 15:17 ?        00:00:00 nginx: worker process

master processの起動ユーザをnginxに変更できました。
念のためcurlで接続確認も実施します。

$ curl http://localhost:9999 -o /dev/null -w '%{http_code}\n' -s
200

ステータスコード200が確認できました。

6.あとがき

nginxサービスを一般ユーザで起動することに成功しました。
こういう検証がぱぱっとできるのがクラウドの利点ですね。

そういえばcurlコマンドってカールって読むんですね。
今までキュールと発音していたので気を付けます…。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?