我正在Ubuntu-2204在 GitHub Action 中使用 Nginx 设置一个简单的 Web 服务器。我想使用 Nginx 作为反向代理将请求发送到后端 PHP-FPM。但是,当我将 root 指令设置为$GITHUB_工作空间,它无法按预期工作。我创建了一个示例存储库演示问题。即使在没有 PHP-FPM 配置的情况下提供静态 index.html,它仍然无法找到并返回 HTTP 404 错误。
Run curl -vf localhost
* Trying 127.0.0.1:80...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Server: nginx/1.18.0 (Ubuntu)
< Date: Sun, 01 Jan 2023 05:15:29 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 162
< Connection: keep-alive
* The requested URL returned error: 404
Nginx 生成的日志内容如下:
2023/01/01 05:15:29 [crit] 2025#2025: *1 stat() "/home/runner/work/gh-action-playground/gh-action-playground/public/" failed (13: Permission denied), client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
2023/01/01 05:15:29 [crit] 2025#2025: *1 stat() "/home/runner/work/gh-action-playground/gh-action-playground/public/" failed (13: Permission denied), client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
该问题似乎是一个常见的权限问题。我创建了一个名为“修复权限”的操作来尝试修复它。
- name: Fix permission
run: |
sudo usermod -aG docker www-data
sudo chown -R www-data:www-data ${{ github.workspace }}
sudo chmod -R 777 public
sudo -u www-data bash -c 'cd ${{ github.workspace }}/public; pwd; whoami'
sudo -u www-data stat /home/runner/work/gh-action-playground/gh-action-playground/public
sudo -u www-data stat /home/runner/work/gh-action-playground/gh-action-playground
sudo -u www-data stat /home/runner/work/gh-action-playground
sudo -u www-data stat /home/runner/work
sudo -u www-data stat /home/runner
sudo -u www-data stat /home
sudo -u www-data stat /
echo '<h1>test</h1>' >> public/index.html
echo "::group::debug"
ls -al
ls -al ../
ls -al ../../
ls -al ../../../
df -h
ps auxwww
mount
echo "::endgroup::"
但失败了。失败作业的输出可以在以下位置找到:https://github.com/Gasol/gh-action-playground/actions/runs/3815377892/jobs/6490328178。如您所见,根目录设置为/home/runner/work/gh-action-playground/gh-action-playground/public
,这是index.html文件的正确位置。
我正在使用以下脚本来确保 www-data 用户有权将目录更改为虚拟服务器的根目录。
sudo -u www-data bash -c 'cd ${{ github.workspace }}/public; pwd; whoami'
输出正确如下。
/home/runner/work/gh-action-playground/gh-action-playground/public
www-data
该ps
命令显示 nginx 以www-data
用户身份运行
root 2024 0.0 0.0 81896 2176 ? Ss 05:15 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 2025 0.0 0.0 82652 6608 ? S 05:15 0:00 nginx: worker process
www-data 2026 0.0 0.0 82652 6608 ? S 05:15 0:00 nginx: worker process
有趣的是有用当我将根目录移动到 /var/html/public 时。那么,为什么 Nginx 无法访问 $GITHUB_WORKSPACE/public 目录中的 index.html 文件?$GITHUB_WORKSPACE 和 /var/html/public 有什么区别?
答案1
看来 Nginx 无法访问 $GITHUB_WORKSPACE/public 目录,原因是权限不足。错误消息 (13: Permission denied) 表明 Nginx 没有访问该目录所需的权限。
$GITHUB_WORKSPACE 和 /var/html/public 的区别在于,$GITHUB_WORKSPACE 是当前正在 GitHub Action 中构建的仓库的根目录,而 /var/html/public 是你系统上的目录。Nginx 很可能具有访问 /var/html/public 所需的权限,但没有访问 $GITHUB_WORKSPACE/public 所需的权限。
要解决此问题,您可以尝试授予 Nginx 访问 $GITHUB_WORKSPACE/public 目录所需的权限。您可以通过运行以下命令来执行此操作:
sudo chmod -R 755 $GITHUB_WORKSPACE/public
这将授予所有用户对 $GITHUB_WORKSPACE/public 目录中所有文件和目录的读取和执行权限。
或者,您可以尝试将 $GITHUB_WORKSPACE/public 目录的所有权更改为运行 Nginx 的用户。您可以通过运行以下命令来执行此操作:
sudo chown -R www-data:www-data $GITHUB_WORKSPACE/public