CentOS 8: NginxでCGIを利用できるようにする

以前 Ubuntu ではやったけど、今度は CentOS で。

fcgiwrap のインストール

標準のリポジトリには無いようなので EPEL からインストール。

[takatoh@rollo ~]$ sudo dnf -y install epel-release
[takatoh@rollo ~]$ sudo dnf --enablerep=epel -y install fcgiwrap

Nginx の設定

CGI を利用したいサイトの設定ファイルの server セクションにつぎを追加。

location ~ \.cgi$ {
        root  /var/www/app;
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include  /etc/nginx/fastcgi_params;
}

で、Nginx をリスタート。

[takatoh@rollo ~]$ sudo systemctl restart nginx

fcgiwrap 用の設定ファイルを作成して起動。

/usr/lib/systemd/system/fcgiwrap.service

[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target
Requires=fcgiwrap.socket

[Service]
EnvironmentFile=/etc/sysconfig/fcgiwrap
ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS}
User=nginx
Group=root

[Install]
Also=fcgiwrap.socket

/usr/lib/systemd/system/fcgiwrap.socket

[Unit]
Description=fcgiwrap socket

[Socket]
ListenStream=/run/fcgiwrap.socket

[Install]
WantedBy=sockets.target

起動。

[takatoh@rollo system]$ sudo systemctl enable --now fcgiwrap

SELinux

SELinux を有効にしているので、ポリシーを作る。

nginx-server.te

module nginx-server 1.0;

require {
    type httpd_t;
    type var_run_t;
    class sock_file write;
}

#======== httpd_t ========
allow httpd_t var_run_t:sock_file write;
[takatoh@rollo ~]$ sudo checkmodule -m -M -o nginx-server.mod nginx-server.te
[takatoh@rollo ~]$ sudo semodule_package --outfile nginx-server.pp --module nginx-server.mod
[takatoh@rollo ~]$ sudo semodule -i nginx-server.pp

CGI のテスト

設定したディレクトリ(今回は /var/www/app)の中に、hello.cgi を作成。

#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print <<EOC
<html>
  <body>
    <h1>Hello</h1>
    <p>Hello, from CGI!</p>
  </body>
</html>
EOC

実行権限をつけるのを忘れずに。

今回はスマホから確認した。OKだった。