启用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文件。