LINUX.ORG.RU

Два nginx на одном хосте, один - к веб-серверу, другой - к passenger’у redmine. Проблема с правами

 , ,


0

1

Здравствуйте.

На Сентос 7 стоит связка nginx+apache. Запрос принимает nginx на 80 порт, обрабатывает, и передает apache на 88 порт.

На апаче стоит несколько сайтов вида subdomain.domain.ru, перенаправление работает.

На этом же компе установлен ruby и redmine с passenger’ом и nginx. Nginx запускается на порту 81, доменное имя для redmine прописано в его настройках (redmine.domain.ru), пути верные, управление происходит другими командами, нежели основной nginx.

Предполагаю, что два nginx не пересекаются.

В основной nginx добавлено перенаправление в доп.конфиг, что при обращении по redmine.domain.ru, запрос отправлять на 81 порт. Установка редмина прошла без ошибок, перезапуск обоих nginx и apache тоже без ошибок, но при запросе в браузере - 403 Forbidden.

Второй nginx и сам redmine установлен в директорию /opt, пользователь redmine - владелец директории redmine. После рекурсивной смены владельца директории redmine на пользователя nginx - та же ошибка. Файрвол открыт и для 81 порта, при запросе redmine.domain.ru:81 - так же forbidden.

Точно также настроенный redmine с passenger'ом и nginx (без основного nginx) на другом хосте работает.

Как настроить права, чтобы доступ до redmine был?

Основной конфиг nginx

/etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log crit;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    server_names_hash_max_size 2048;
    server_names_hash_bucket_size 512;

    server_tokens off;
    client_max_body_size 100m;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
gzip on;
  gzip_min_length  1100;
  gzip_buffers  4 32k;
  gzip_types    text/plain application/x-javascript text/xml text/css;
  ignore_invalid_headers on;
  client_header_timeout  3m;
  client_body_timeout 3m;
  send_timeout     3m;
  connection_pool_size  256;
  client_header_buffer_size 4k;
  large_client_header_buffers 4 64k;
  request_pool_size  4k;
  output_buffers   4 32k;
  postpone_output  1460;

  # Cache most accessed static files
  open_file_cache          max=10000 inactive=10m;
  open_file_cache_valid    2m;
  open_file_cache_min_uses 1;
  open_file_cache_errors   on;
   include /etc/nginx/conf.d/*.conf;
}
Перенаправление на redmine.domain.ru
/etc/nginx/conf.d/redmine.conf

upstream redmine {
    server 127.0.0.1:81;
    }

server {
    listen 192.168.1.101:80;
    server_name redmine.domain.ru;
    error_log /var/log/redmine-error.log;
    location / {
       proxy_pass http://redmine;
       proxy_redirect off;
       proxy_set_header Host $host;
    }
}

И конфиг nginx на passenger’е

/opt/nginx/conf/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
passenger_root /usr/local/lib/ruby/gems/2.3.0/gems/passenger-5.0.30;
    passenger_ruby /usr/local/bin/ruby;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       81;
        server_name  redmine.domain.ru;
        passenger_enabled on;
        root /opt/redmine-3.1.7/public;
        }
}

В логах второго nginx:

 /opt/nginx/logs/errors.log

2017/02/01 11:10:19 [notice] 21242#0: signal process started

[ 2017-02-01 11:10:19.3524 404/7f5d3bb2f700 age/Cor/CoreMain.cpp:532 ]: Signal received. Gracefully shutting down... (send signal 2 more time(s) to force shutdown)

[ 2017-02-01 11:10:19.3525 411/7f7ee08e8700 age/Ust/UstRouterMain.cpp:422 ]: Signal received. Gracefully shutting down... (send signal 2 more time(s) to force shutdown)
[ 2017-02-01 11:10:19.3526 411/7f7ee5fc1880 age/Ust/UstRouterMain.cpp:492 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected...
[ 2017-02-01 11:10:19.3528 411/7f7ed3fff700 Ser/Server.h:817 ]: [UstRouterApiServer] Freed 0 spare client objects
[ 2017-02-01 11:10:19.3528 411/7f7ed3fff700 Ser/Server.h:464 ]: [UstRouterApiServer] Shutdown finished
[ 2017-02-01 11:10:19.3528 404/7f5d417ee880 age/Cor/CoreMain.cpp:901 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected...
[ 2017-02-01 11:10:19.3529 404/7f5d3b32e700 Ser/Server.h:817 ]: [ApiServer] Freed 0 spare client objects
[ 2017-02-01 11:10:19.3530 404/7f5d3b32e700 Ser/Server.h:464 ]: [ApiServer] Shutdown finished
[ 2017-02-01 11:10:19.3530 411/7f7ee08e8700 Ser/Server.h:464 ]: [UstRouter] Shutdown finished
[ 2017-02-01 11:10:19.3533 404/7f5d3bb2f700 Ser/Server.h:817 ]: [ServerThr.1] Freed 128 spare client objects
[ 2017-02-01 11:10:19.3533 404/7f5d3bb2f700 Ser/Server.h:464 ]: [ServerThr.1] Shutdown finished
[ 2017-02-01 11:10:19.3551 411/7f7ee5fc1880 age/Ust/UstRouterMain.cpp:523 ]: Passenger UstRouter shutdown finished
[ 2017-02-01 11:10:19.3705 21244/7f211badb880 age/Wat/WatchdogMain.cpp:1291 ]: Starting Passenger watchdog...
[ 2017-02-01 11:10:19.3867 404/7f5d417ee880 age/Cor/CoreMain.cpp:967 ]: Passenger core shutdown finished
[ 2017-02-01 11:10:19.3882 21247/7f4be84b1880 age/Cor/CoreMain.cpp:982 ]: Starting Passenger core...
[ 2017-02-01 11:10:19.3885 21247/7f4be84b1880 age/Cor/CoreMain.cpp:235 ]: Passenger core running in multi-application mode.
[ 2017-02-01 11:10:19.3908 21247/7f4be84b1880 age/Cor/CoreMain.cpp:732 ]: Passenger core online, PID 21247
[ 2017-02-01 11:10:19.4003 21254/7f7338284880 age/Ust/UstRouterMain.cpp:529 ]: Starting Passenger UstRouter...
[ 2017-02-01 11:10:19.4014 21254/7f7338284880 age/Ust/UstRouterMain.cpp:342 ]: Passenger UstRouter online, PID 21254
manik207 ()

Проблема у тебя в рамках nginx, который работает с passenger'ом, основной не трогай, он ни при чем. Когда добьешься работы на 81 порту - на 80 должно заработать само (ну может надо будет передать какие-нибудь proxy параметры еще)

Меня больше всего смущает вот этот пункт:

После рекурсивной смены владельца директории redmine на пользователя nginx - та же ошибка.

nginx который работает с руби вовсе не обязан работать с теми же правами что и основной, они общаются через сетевой стэк (позже можешь на unix:// сокет поменять) скорее всего ты что-то убил в процессе и у тебя теперь еще и с руби проблема. Верни все как было.

Forbidden бывает еще и когда сервер не знает что вызывать в качестве index. Попробуй запросить какой-нибудь прямой файл через 81 порт и посмотри, если он отдается - значит или индекс или проблема в самой руби.

BaBL ★★★★ ()
Ответ на: комментарий от thesis

В access.log второго nginx - чисто, в основном:

/var/log/nginx.access.log

192.168.1.105 - - [01/Feb/2017:12:14:49 +0300] "GET /redmine.domain.ru/themes/classic/images/home.png HTTP/1.1" 404 242 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.1.673 Safari/537.36" "-"
192.168.1.105 - - [01/Feb/2017:12:15:53 +0300] "GET /redmine.domain.ru/themes/classic/images/home.png HTTP/1.1" 404 242 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.1.673 Safari/537.36" "-"
192.168.1.105 - - [01/Feb/2017:12:18:49 +0300] "GET /redmine.domain.ru/ HTTP/1.1" 403 216 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.1.673 Safari/537.36" "-"
192.168.1.105 - - [01/Feb/2017:12:19:34 +0300] "GET /redmine.domain.ru/ HTTP/1.1" 403 216 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.1.673 Safari/537.36" "-"
192.168.1.105 - - [01/Feb/2017:12:19:35 +0300] "GET /favicon.ico HTTP/1.1" 404 209 "http://redmine.domain.ru/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.1.673 Safari/537.36" "-"

Видно, что идут запросы, по прямому запросу - 403, по остальным - 404...

Подскажите, где смотреть, что говорит passenger?

manik207 ()
Ответ на: комментарий от BaBL

Запрос любого существующего файла - 404, а запрос самого сайта - 403.

Логи приведены ниже. Где руби поломан, сказать сложно, всё сделано по отработанной инструкции, и ошибок не вылезло... Что возвращать - непонятно. Можно еще раз переставить руби.

Добавлен в корень директории index.html (с правами 777) - 404...

Глупый вопрос, ногами не бейте: сокет на unix:// где поменять?

manik207 ()

Глупый вопрос, ногами не бейте: сокет на unix:// где поменять?

У тебя он не используется пока, не трогай.

Добавлен в корень директории index.html (с правами 777) - 404...

Ну вот, у второго nginx рут директория не прописана видимо. А Forbidden не из-за прав, а из-за отсутствия индексного файла, соответствующего директиве index нгинкса.

Посмотри теперь эррорлог второго нгинкса, в нем может быть указано где он пытается что-то найти.

Update
Попробуй убрать
server_name redmine.domain.ru;
у меня есть подозрение что ты лезешь не по этому домену.

BaBL ★★★★ ()
Последнее исправление: BaBL (всего исправлений: 1)
Ответ на: комментарий от BaBL

Спасибо!!!

Ситуация прояснилась. Запрос по адресу redmine.domain.ru приходит на основной nginx, который дальше должен перенаправлять его на пассенжер-nginx, но запрос принимает apache (и выдает forbidden), хотя на него никто не перенаправляет. Конфиг основного nginx, который направляет на apache:

/etc/nginx/conf.d/apache.conf
upstream apache {
    server 192.168.1.101:88;
    }

server {
    listen 192.168.1.101:80;
    server_name site1.domain.ru;
    server_name site2.domain.ru;
    error_log /var/log/apache-error.log;
    include /etc/nginx/errordocs_default.inc;
    location / {
       proxy_pass http://apache;
       proxy_redirect off;
       proxy_set_header Host $host;
    }
}
При любом прямом запросе на порт 81, имя субдомена не имеет значения (redmine.domain.ru или 123.domain.ru) - редмин работает… В настройке passenger’ского nginx директива server_name раскомменчена. (при закомменченой тоже работает)

Т.е. теперь вопрос, в какой форме прописать основному nginx’у локальные адреса (и в каком месте конфига), чтобы основной nginx мог перенаправить запрос на 81 порт этого же хоста? Иначе запрос не принимается passenger'ом и отправляется на апач...

manik207 ()

Я вообще все через rvm делал. Установил локально ruby, через него gem поставил

rvmsudo passenger-install-nginx-module

и все работает от пользователя.

nginx в opt

[root@passenger ~]# cat /opt/nginx/conf/hosts/redmine.conf 
    server {
        listen       80;
        server_name  redmine.local;
 
        root /home/appuser/redmine/public;
        passenger_enabled on;
        client_max_body_size      10m; 
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


http {
    passenger_root /home/appuser/.rvm/gems/ruby-2.3.3/gems/passenger-5.1.2;
    passenger_ruby /home/appuser/.rvm/gems/ruby-2.3.3/wrappers/ruby;
int13h ★★★★★ ()
Ответ на: комментарий от int13h

Спасибо за ответ.

Вы правы, ruby при установке призывает ставить его из-под пользователя. Есть предположение, что это может влиять на «неперенаправляемость» на passenger?

Вопрос в том, что могут ли ужиться на одном хосте два nginx, чтобы один принимал все запросы и роутил их как на редмин, так и на апач, по доменным именам?

manik207 ()
Ответ на: Спасибо за ответ. от manik207

Вы правы, ruby при установке призывает ставить его из-под пользователя.

У меня даже на сервере ruby нет. Все локально. Да, и у rvm приоритетно установка для пользователя, а не глобально.

Есть предположение, что это может влиять на «неперенаправляемость» на passenger?

Нет. Я раньше ставил все глобально, а недостающие пакеты — локально. Все работало. Возможно, у вас проблема в правах.

Вопрос в том, что могут ли ужиться на одном хосте два nginx, чтобы один принимал все запросы и роутил их как на редмин, так и на апач, по доменным именам?

Да, конечно.

nginx (80) ----> php-fpm (9000)
|
|
|--------------> nginx(8001)
                      |
                      |
                      passengermodule

int13h ★★★★★ ()
Ответ на: комментарий от int13h

Спасибо за схему))))

Правильно ли я поняла, что глобально/локально - это от root/пользователя?

С php-fpm не сталкивалась, если я правильно поняла, это модуль nginx, у меня бекэнд на апаче. Вы описали новый вариант. На имеющейся связке

 nginx (80)--------------->apache(88)
  |
  |
  |------------------>nginx(81) ----->passenger
такое возможно?

manik207 ()
Ответ на: Спасибо!!! от manik207

Проблема решена изучением конфига основного nginx.

/etc/nginx/conf.d/redmine.conf

upstream redmine {
    server 127.0.0.1:81; 
#   Вариант 192.168.1.101:81 - тоже работает
    }

server {
#Неправильно
#   listen 192.168.1.101:80;
#Правильно
    listen 80;
    server_name redmine.domain.ru;
...
Теперь читаются и сайт redmine.domain.ru, и сайты на апаче. СПАСИБО всем!!!!

manik207 ()