aliases Nginx e proxy_pass

2

Estou usando o nginx como front-end da web e o apache2 como back-end da web. O Apache roda vários sites localmente e o nginx os acessa.

No momento, diferentes subdomínios são hospedados, mas eu quero migrá-los para um único usando http://my-single-domain.com/subdomain-alias graças ao nginx.

O diretório raiz e a porta vache do apache2 são diferentes para cada subdomínio (parece óbvio, não é?).

Eu tentei diversas configurações, mas não consigo enviar o recurso, ou seja, o índice html é enviado, mas os recursos não são encontrados pelo servidor ( 404 Not Found ), apesar da regra root estar definida.

Eu tentei diversas soluções, como:

location /alias1 {
  proxy_pass   http://127.0.0.1:9095/;
  include      /etc/nginx/proxy.conf;
}

ou

location /alias1 {
  alias  /alias1/;
  proxy_pass   http://127.0.0.1:9095/;
  include      /etc/nginx/proxy.conf;
}

ou até mesmo

location /alias1/ {
  rewrite ^/alias1(/.*)$ $1 break;
  proxy_pass http://127.0.0.1:9095/;
}

ou novamente

location /alias1/ {
  rewrite ^/alias1(/.*)$ $1 break;
  proxy_pass   http://127.0.0.1:9095/;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

O que há de errado com essa configuração? Como definir nginx para recuperar ativos de um diretório raiz específico quando a idade /alias1/page for solicitada?

Perguntado primeiro em webmasters.stackexchange.com

--- ### /etc/nginx/proxy.conf       proxy_redirect off;       proxy_set_header Host $ host;       proxy_set_header X-Real-IP $ remote_addr;       proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;       proxy_set_header X-Forwarded-Proto https;       #client_max_body_size 10m;       #client_body_buffer_size 128k; proxy_connect_timeout 90;       #proxy_send_timeout 90; proxy_read_timeout 90;       proxy_buffers 32 4k;

/etc/nginx/nginx.conf

 user              www-data  www-data;

 worker_processes  2;

 pid        /var/run/nginx.pid;

 worker_rlimit_nofile 1024;

 events {
         worker_connections 512;
 }


 http {

         include /etc/nginx/mime.types;
         default_type application/octet-stream;
         sendfile "on";
         tcp_nopush "on";
         tcp_nodelay "on";
         keepalive_timeout "65";
         access_log "/var/log/nginx/access.log";
         error_log "/var/log/nginx/error.log";
         server_tokens off;
         types_hash_max_size 2048;

         include /etc/nginx/conf.d/*.conf;
         include /etc/nginx/sites-enabled/*/*;
 }

/etc/nginx/site-enable/single-domain.conf

server {
        listen      443;
        ssl on;
        ssl_certificate /etc/ssl/private/single-domain.com-with_chain.crt;
        ssl_certificate_key /etc/ssl/private/single-domain.com.key.pem;

        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/private/dhparams.pem;

        server_name www.single-domain.com;

        location / {
                proxy_pass   http://127.0.0.1:8090/;
                include      /etc/nginx/proxy.conf;
        }

        location /alias/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:8103/;
        proxy_set_header Host alias.single-domain.com;
        root /var/www/alias.single-domain.com;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx|otf|eot|svg|ttf|woff)$ {
                root /var/www/single-domain.com/public;
                proxy_buffering on;
                proxy_cache_valid 200 120m;
                expires 864000;
        }

        access_log /var/log/nginx/single-domain.com/www-access.log;
        error_log /var/log/nginx/single-domain.com/www-error.log;
}
    
por Auzias 04.03.2016 / 15:04

1 resposta

2

Se o apache estiver escutando na porta 9095 do domínio sub1.example.com e na porta 9096 do domínio sub2.example.com , e você quiser que o nginx passe http://www.example.com/alias1 para primeiro e http://www.example.com/alias2 para o segundo virtualhost apache, você faria:

location /alias1/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:9095/;
        proxy_set_header Host sub1.example.com;
}

location /alias2/ {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass   http://127.0.0.1:9096/;
        proxy_set_header Host sub2.example.com;
}

então, por exemplo, a solicitação original para nginx em http://your-single-domain.example.com/alias1/foo/page1.html seria encaminhada para o apache como se fosse para http://sub1.example.com:9095/foo/page1.html

E a solicitação original para nginx em http://your-single-domain.example.com/alias2/bar/baz/page2.html seria encaminhada para o apache como se fosse para http://sub2.example.com:9096/bar/baz/page2.html

Update1 (prova de conceito): com o nginx tendo o arquivo de configuração somente como acima, nós rodamos o netcat como nc -l -p 9095 (o apache não deveria estar escutando naquela porta para esta depuração), e então abrimos no navegador http://www.single-domain.com/alias1/assets/style.css . Devemos ver na saída do netcat o seguinte:

GET /assets/style.css HTTP/1.1
Host: sub1.example.com
Connection: close
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.6.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1

Se houvesse o apache ouvindo na porta 9095 em vez do nosso netcat, ele receberia a solicitação HTTP / 1.1 para o link " URL" " "(que seria mostrado em /var/log/apache2/access_log ou similar)

Observe que rewrite ^/alias1(/.*)$ $1 break; não é necessário, pois location /alias1/ removerá automaticamente essa /alias1/ parte da URL.

Se você obter resultados diferentes ao usar o seu arquivo de configuração nginx, isso significa que você tem diretivas conflitantes no nginx - nesse caso, recomendo começar apenas com a configuração desta resposta, verificando se ela funciona e então comece a adicionar blocos de configuração antigos um por um até que ele quebre - e então você terá um bloco conflitante que precisa mudar.

Update2 : desde que você postou sua configuração do nginx, é óbvio - você tem uma substituição de local que diz que todos os seus arquivos .css (junto com outros arquivos) devem ser servidos diretamente com o nginx de /var/www/single-domain.com/public . Remova ou edite-o e ele passará pelo apache.

    
por 09.03.2016 / 22:34