fcgiwrap在其他系统上一般直接输命令就能安装,但是OracleLinux9会提示找不到软件包。安装成功后,selinux也会阻碍nginx的调用。
原因
OracleLinux9的这个软件包位于默认不启用的developer
仓库。
安装fcgiwrap
- 编辑配置,将repo启用
bash
sudo vi /etc/yum.repos.d/oracle-epel-ol9.repo
sudo dnf update
- 成功安装
bash
sudo dnf install fcgiwrap
手动配置fcgiwrap服务
安装的fcgiwrap并没有systemd服务,因此需要手动配置
- 新建
/var/run/nginx
目录
bash
cd /var/run
sudo mkdir nginx
sudo chown nginx:nginx nginx
- 创建fcgiwrap服务(需要先安装nginx)
bash
sudo dnf install nginx
sudo nano /etc/systemd/system/fcgiwrap.service
写入如下内容
bash
[Unit]
Description=Simple CGI Server
After=network.target
[Service]
ExecStart=/usr/sbin/fcgiwrap -s unix:/run/nginx/fcgiwrap.socket
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
- 刷新并启动服务,查看运行状态
bash
sudo systemctl daemon-reload
sudo systemctl start fcgiwrap
sudo systemctl status fcgiwrap
- 启动正常后,设置开机启动
bash
sudo systemctl enable fcgiwrap
配置nginx CGI
- 进入某网站的配置
bash
sudo vi /etc/nginx/conf.d/yourweb.conf
- 写入cgi配置
css
location /cgi-bin/yourcgi {
include fastcgi_params;
fastcgi_pass unix:/var/run/nginx/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /path/to/your/cgi/file;
# 继续传递其他参数...
}
解决selinux问题
在这一步后,nginx对cgi的访问仍然会被selinux拦截,因此还需要放行访问。请按如下步骤操作
- 创建审计规则文件夹
bash
sudo mkdir /etc/selinux/audit2allow
cd /etc/selinux/audit2allow
- 访问目标cgi路径,被拒绝访问
- 查看审计拦截情况
bash
sudo cat /var/log/audit/audit.log | grep nginx | grep denied
输出示例如下
bash
type=AVC msg=audit(1699720883.997:1431781): avc: denied { connectto } for pid=2205472 comm="nginx" path="/var/run/nginx/fcgiwrap.socket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
- 基于此创建放行规则
bash
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M allow_nginx_proxy_fcgiwrap
正常情况下输出:
bash
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i allow_nginx_proxy_fcgiwrap.pp
- 加载放行规则
bash
sudo semodule -i allow_nginx_proxy_fcgiwrap.pp
- 检查是否能正常访问cgi,如不行,重复执行2~6直至成功访问。
- 大功告成!