Запуск Nginx в GitHub Action приводит к ошибке «Отказано в разрешении»

Я использую Ubuntu-2204 в GitHub Action, чтобы настроить простой веб-сервер с использованием Nginx. Я хочу использовать Nginx в качестве обратного прокси-сервера для отправки запросов на серверную часть PHP-FPM. Однако когда я установил корневую директиву $GITHUB_WORKSPACE, она не работает должным образом. Я создал , чтобы продемонстрировать проблему. Даже при обслуживании статического index.html без конфигурации PHP-FPM. его все еще не удается найти, и он возвращает ошибку 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

The 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 не может получить доступ к файлу index.html в каталоге $GITHUB_WORKSPACE/public? В чем разница между $GITHUB_WORKSPACE и /var/html/public?

1 ответ

Похоже, что Nginx не может получить доступ к каталогу $GITHUB_WORKSPACE/public из-за отсутствия разрешений. Сообщение об ошибке (13: Разрешение отклонено) предполагает, что у Nginx нет необходимых разрешений для доступа к каталогу.

Разница между $GITHUB_WORKSPACE и /var/html/public заключается в том, что $GITHUB_WORKSPACE — это корневой каталог репозитория, который в данный момент создается в действии GitHub, а /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
Другие вопросы по тегам