Запуск 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