Коротко — потому что какой‑то процесс уже держит нужный порт (обычно 80 и/или 443), и при повторном старте встроенного nginx GitLab не может его занять. Причины типично такие:
- На системе уже запущен системный nginx/apache/caddy/другой веб‑сервер.
- Какой‑то контейнер (Docker) занимает порт.
- Процесс nginx остался висеть или остался PID‑файл, и новый экземпляр не стартует.
- (Меньше вероятно) служба VPN/другой сервис захватывает порт.
Что сделать — пошагово диагностика и варианты исправления.
1) Найти, кто слушает порт(ы)
- Посмотреть слушающие TCP‑порты:
sudo ss -ltnp | grep -E ':80|:443'
или
sudo lsof -i :80 -i :443
или (если ss/lsof нет)
sudo netstat -tlnp | grep -E ':80|:443'
Вы получите PID/имя процесса — это укажет виновника (nginx, apache2, caddy, docker-proxy и т. п.).
2) Проверить процессы nginx/GitLab
- Посмотреть процессы:
ps aux | grep nginx
sudo gitlab-ctl status
- Посмотреть логи nginx/GitLab:
sudo gitlab-ctl tail nginx
sudo journalctl -u nginx -e
3) Быстрое решение (если найден сторонний веб‑сервер)
- Если у вас обычный системный nginx/Apache, и вы хотите, чтобы GitLab управлял своим nginx — остановите/отключите системный:
sudo systemctl stop nginx
sudo systemctl disable nginx
затем перезапустите GitLab nginx:
sudo gitlab-ctl restart nginx
- Если вы хотите, чтобы GitLab был за внешним веб‑сервером, отключите встроенный nginx в конфиге GitLab (Omnibus):
В /etc/gitlab/gitlab.rb добавить/изменить:
nginx['enable'] = false
затем
sudo gitlab-ctl reconfigure
и настройте внешний nginx/apache как reverse proxy к Unicorn/Workhorse GitLab.
4) Изменить порты GitLab (альтернатива)
- Можно назначить GitLab слушать другой порт:
В /etc/gitlab/gitlab.rb:
external_url 'http://gitlab.example.com:8080'
nginx['listen_port'] = 8080
затем
sudo gitlab-ctl reconfigure
5) Если процесс «завис» или остался PID‑файл
- Убедитесь, что реального процесса нет, потом удалите stale PID и запустите заново:
sudo pkill nginx (или sudo kill <PID>)
проверить нет ли процесса: ps aux | grep nginx
удалить PID если есть (путь может быть /var/run/nginx.pid или /var/opt/gitlab/nginx/nginx.pid)
sudo gitlab-ctl start
6) Не забудьте проверить Docker/контейнеры
- docker ps — возможно, контейнер занимает порт.
7) Особенности Netbird/VPN
- Netbird сам по себе обычно не занимает 80/443. Но проверьте, не подхватил ли он какой‑то проброс портов — команда ss/lsof покажет.
Если хотите, пришлите выводы этих команд:
- sudo ss -ltnp | grep -E ':80|:443'
- sudo gitlab-ctl status
- ps aux | grep nginx
и я подскажу конкретно по вашему случаю.