启用NGINX的CGI设置(适用于RHEL7及之后版本)

首先

为了能够使用CGI,在本次搭建中,我们将使用NGINX来搭建由GNU GLOBAL创建的网页搜索栏。

建立Web服务器

使用命令安装NGINX。

以下是我用母语中文的一种释义选择:
我所参考的网站是关于如何在Red Hat企业Linux中安装NGINX的。
参考资料链接:https://access.redhat.com/solutions/1211673

执行以下命令来安装NGINX。

dnf install -y nginx

执行以下命令以检查NGINX的状态。

systemctl status nginx

执行结果。

● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

执行以下命令以启动NGINX。

systemctl start nginx

执行以下命令以检查状态。
当确认看到星标时,可以确认状态已变为”active (running)”。

# systemctl status nginx

执行结果

● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-11-29 22:57:15 JST; 5s ago ★
  Process: 1553 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1551 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 1549 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 1554 (nginx)
    Tasks: 3 (limit: 23529)
   Memory: 14.6M
   CGroup: /system.slice/nginx.service
           tq1554 nginx: master process /usr/sbin/nginx
           tq1555 nginx: worker process
           mq1556 nginx: worker process

确认NGINX服务的自动启动设置。

我来确认以下命令,确认NGINX是否已被设置为自动启动。

systemctl list-unit-files | grep nginx

执行结果

nginx.service                              disabled

可以确认未设置自动启动。

启用NGINX的自动启动服务

执行下列命令以启用NGINX的自动启动。

systemctl enable nginx

执行结果

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

确认启用NGINX的服务自动启动。

执行以下命令以确认已启用NGINX的自动启动。

systemctl list-unit-files | grep nginx

执行结果 (shí jié guǒ)

nginx.service                              enabled

请确认在网络浏览器中是否显示了测试页面。

请在Web浏览器中输入以下地址以确认测试页面是否显示。

http://サーバのIPアドレス/

首页部分摘录

你现在应该将你的内容放到你选择的位置,并且在 nginx 配置文件 /etc/nginx/nginx.conf 中编辑根配置指令。

由於上述描述,可以確認”/etc/nginx/nginx.conf”是設定文件。

计算机生成图像具有实现图像化的能力。

启用NGINX的CGI设置。

因为使用CGI创建的GNU GLOBAL Web页面搜索框,需要启用NGINX的CGI。这次我们使用的是fcgiwrap。

以下是我参考的 URL。

FCGI Wrap
https://mogile.web.fc2.com/nginx_wiki/start/topics/examples/fcgiwrap/

FCGI Wrap 是一个使用示例,可用于在 Nginx 服务器上实现 FCGI 包装。

Arch Linux维基百科
https://wiki.archlinux.jp/index.php/Nginx#添加CGI

赤帽工程师博客
https://rheb.hatenablog.com/entry/2019/08/16/EPEL8%E5%88%9D%E6%AD%A5%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8

使用SYSTEMD进行服务管理的第3章
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-services-with-systemd_configuring-basic-system-settings

启用EPEL存储库

由于fcgiwrap包已包含在EPEL包中,因此需要启用EPEL存储库。

运行以下命令,添加EPEL仓库。

dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

搜索fcgiwrap软件包。

执行以下命令以搜索fcgiwrap软件包。

dnf search fcgiwrap

运行结果

Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 0:16:32 時間前の 2020年11月29日 23時06分19秒 に実施しました。
========================================================== 名前 完全一致: fcgiwrap ==========================================================
fcgiwrap.x86_64 : Simple FastCGI wrapper for CGI scripts

确认fcgiwrap软件包提供的存储库。

运行以下命令以确认fcgiwrap软件包的提供源。

dnf list fcgiwrap

执行结果

Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 0:16:20 時間前の 2020年11月29日 23時06分19秒 に実施しました。
利用可能なパッケージ
fcgiwrap.x86_64                                             1.1.0-12.20181108git99c942c.el8                                              epel

安装fcgiwrap软件包。

执行以下命令以安装fcgiwrap软件包。

dnf install -y fcgiwrap

fcgiwrap包安装完成后,检查/usr/share/doc/fcgiwrap/SETUP,因为以下的描述,我们将为NGINX创建一个定制的unit文件。

确认以下命令,查看fcgiwrap相关文档的内容。

cat /usr/share/doc/fcgiwrap/SETUP

运行结果(部分摘录)

2. The systemd unit files provided with this package are instantiated and must
   be started by specifiying the desired web server user account. For example,
   when using nginx, the fgciwrap service is enabled then started like so:

      systemctl enable fcgiwrap@nginx.socket
      systemctl start fcgiwrap@nginx.socket

复制fcgiwrap的unit文件

因为有基于fcgiwrap的unit文件,所以执行以下命令来复制unit文件。

cp -p /usr/lib/systemd/system/fcgiwrap@.service /etc/systemd/system/fcgiwrap.service
cp -p /usr/lib/systemd/system/fcgiwrap@.socket /etc/systemd/system/fcgiwrap.socket

执行下面的命令来编辑 fcgiwrap.socket 的 Unit 文件。

vi /etc/systemd/system/fcgiwrap.socket

fcgiwrap.socket変更前

[Unit]
Description=fcgiwrap Socket

[Socket]
ListenStream=/run/fcgiwrap/fcgiwrap-%i.sock
RuntimeDirectory=fcgiwrap
SocketUser=%i
SocketMode=0660

[Install]
WantedBy=sockets.target

★部分在哪里发生了变化。

更改 fcgiwrap.socket 后的情况。

[Unit]
Description=fcgiwrap Socket

[Socket]
ListenStream=/run/fcgiwrap/fcgiwrap.sock ★名前変更
RuntimeDirectory=fcgiwrap
SocketUser=nginx ★名前変更
SocketMode=0660

[Install]
WantedBy=sockets.target

执行以下命令来编辑 fcgiwrap.service 的 Unit 文件。

vi /etc/systemd/system/fcgiwrap.service

fcgiwrap.service之前的更改

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

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

[Install]
Also=fcgiwrap@%i.socket

★這部分是需要修改的地方。

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 ★名前変更

[Install]
Also=fcgiwrap.socket ★名前変更

检查fcgiwrap服务的自动启动设置。

运行以下命令来确认fcgiwrap的自动启动。

systemctl list-unit-files | grep fcgiwrap

可以确认 fcgiwrap 相关的自动启动设置没有被配置。

fcgiwrap.service                           indirect
fcgiwrap@.service                          indirect
fcgiwrap.socket                            disabled
fcgiwrap@.socket                           disabled

启用与fcgiwrap相关的服务自动启动。

执行以下命令以启用fcgiwrap的自动启动。

systemctl enable fcgiwrap
Created symlink /etc/systemd/system/sockets.target.wants/fcgiwrap.socket → /etc/systemd/system/fcgiwrap.socket.

确认是否启用了与fcgiwrap相关的自动启动服务。

请执行以下命令来确认fcgiwrap已启用自动启动功能的设置。

systemctl list-unit-files | grep fcgiwrap

可以确认fcgiwrap.socket已启用。
fcgiwrap.socket是fcgiwrap.service启动的先决条件,因此只需启用fcgiwrap.socket而无需问题。

fcgiwrap.service                           indirect
fcgiwrap@.service                          indirect
fcgiwrap.socket                            enabled
fcgiwrap@.socket                           disabled

将设置应用于systemd

执行以下命令,将新创建的Unit文件加载到systemd中。

systemctl daemon-reload

启动fcgiwrap服务

使用以下命令来启动fcgiwrap服务。

systemctl start fcgiwrap

确认fcgiwrap服务已启动

执行以下命令来启动和确认fcgiwrap服务。

systemctl status fcgiwrap

执行结果

● fcgiwrap.service - Simple CGI Server
   Loaded: loaded (/etc/systemd/system/fcgiwrap.service; indirect; vendor preset: disabled)
   Active: active (running) since Sun 2020-11-29 23:51:49 JST; 5s ago
 Main PID: 2097 (fcgiwrap)
    Tasks: 1 (limit: 23529)
   Memory: 440.0K
   CGroup: /system.slice/fcgiwrap.service
           mq2097 /usr/sbin/fcgiwrap -f -c 1

启用NGINX的CGI设置

执行以下命令来编辑nginx.conf文件。

vi /etc/nginx/nginx.conf

nginx.conf改动之前

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

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

        location / {
        }

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

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

修改了nginx.conf之后

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

----------  追記ここから  ----------
        location ~ \.cgi$ {
        fastcgi_pass   unix:/run/fcgiwrap/fcgiwrap.sock;
        include        /etc/nginx/fastcgi.conf;
        }
----------  追記ここまで  ----------

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

        location / {
        }

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

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

在中文上,可以将”NGINXの構文チェック”翻译为”对NGINX配置进行语法检查”。

执行以下命令以检查nginx.conf的语法。
如果语法有问题,将进行故障排除,直到显示”syntax is ok”为止通过”nginx -t”命令。

nginx -t

运行结果

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

将NGINX和fcgiwrap的配置应用

执行以下命令,重新启动和确认NGINX和fcgiwrap服务。

systemctl restart nginx
systemctl restart fcgiwrap
systemctl status nginx
systemctl status fcgiwrap

确认启用了Web页面的CGI

执行以下命令,创建一个CGI执行测试页面。

vi test.cgi

文件的内容如下。

#!/usr/bin/perl
print "Content-type: text/html \n\n";
print "Hello World";

运行以下命令,在测试页面上赋予读取和执行权限。

chmod 755 test.cgi

请在浏览器中访问以下地址,确认是否显示了”你好,世界”。

http://サーバIP/test.cgi

总结

我第一次知道相比于Apache,启用CGI在NGINX上需要投入一些额外的努力。虽然本次的研究和实机验证花费的时间超出预期,但最终还是成功完成了设置,我认为这很不错。下次,我希望能够使用源代码包,在GNU GLOBAL中创建HTML文件。

广告
将在 10 秒后关闭
bannerAds