在 GitHub Action 中运行 Nginx 导致“权限被拒绝”错误

在 GitHub Action 中运行 Nginx 导致“权限被拒绝”错误

我正在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

答案2

我注意到文件系统权限的更改不会立即生效,需要重新启动相关服务才能使更改生效(请查看这个工作以作为修复示例)。 对我来说,这似乎不寻常。

我还问过这种行为在 GitHub 讨论中,但我会将该主题留在那里。

相关内容