2016-07-13 27 views
1

Ich möchte das Setup für ein Nginx Redmine (und andere Dienste) Reverseproxy Dockerize, aber beim Weiterleiten von Anfragen von Nginx Redmine, sehe ich ein 501 schlechtes Gateway Anfrage über Browser und "failed (111 Connection refused)" am Nginx-Ausgang.Docker - Ausführen von nginx als Proxy für Redmine

Die nginx-Konfiguration arbeitet mit regulären nginx-Server-Weiterleitungsanforderungen (nicht dockered) an einen dockerisierten Redmine-Server, was zu der Annahme führt, dass ich etwas mit dem Netzwerk verschraubt habe. Ich kann auch den der Server direkt über den Port redmine Zugriff 3000.

Hier ist ein Ausschnitt aus meinem Setup:

nginx.conf

http { 
    server { 
     listen 80; 

     # Seeing a 501 Bad Gateway on the browser 
     location /redmine { 
      proxy_pass http://127.0.0.1:3000; 
     } 
    } 
} 

Docker-compose.yaml

version: '2' 
services: 
    nginx: 
     image: nginx 
     ports: 
      - "80:80" 
     volumes: 
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf 
     networks: 
      - shared_internal 
    redmine: 
     image: redmine 
     ports: 
      - "3000:3000" 
     networks: 
      - shared_internal 
networks: 
    shared_internal: 

Antwort

1

Hinweis: ich noch nicht an Bukharov Sergey's answer ausgesehen haben, so dass mehr elegant sein kann.


Hier ist, was ich mir ausgedacht habe. Ich habe 2 Methoden gefunden, um die Netzwerkfreigabefähigkeit zu erreichen, und 1 Hack für ein Redmine-Problem, das bei Verwendung dieser Methoden auftritt.

Methode 1 (bevorzugt, weil es kürzer ist, aber vielleicht nicht, weil es veraltet ist?): Container Linking

Docker-compose.yaml

version: '2' 
services: 
    nginx: 
     image: nginx 
     ports: 
      - "80:80" 
     volumes: 
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf 
     # Method 1: Linking 
     links: 
      - redmine 
    redmine: 
     image: redmine 
     # Method 1: Exposing port to linked containers 
     expose: 
      - "3000" 

nginx.conf

http { 
    server { 
     listen 80; 

# Method 1: Access via alias from link 
     location /redmine/ { 
      proxy_pass http://redmine:3000/; 
     } 
} 

Methode 2: Defining a Network

Docker-compose.yaml

version: '2' 
services: 
    nginx: 
     image: nginx 
     ports: 
      - "80:80" 
     volumes: 
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf 
     # Method 2 
     networks: 
      shared_net: 
       ipv4_address: 172.22.0.4 
    redmine: 
     image: redmine 
     # Method 2 
     networks: 
      shared_net: 
       ipv4_address: 172.22.0.5 
# Method number 2: Via networks 
networks: 
    shared_net: 
     driver: bridge 
     ipam: 
      config: 
       - subnet: 172.22.0.0/16 
        gateway: 172.22.0.1 

nginx.conf

http { 
    server { 
     listen 80; 

# Method 2: Access via ip address in shared network 
     location /redmine_networked/ { 
      proxy_pass http://172.22.0.5:3000/; 
     } 
    } 
} 

Redmine Hack: Accessing redmine via a suburl

Die obigen Lösungen ermöglichen den Zugriff auf Redmine Homepage. Alle Redmine-URLs verweisen jedoch auf root (z. B. "/" für "home" anstelle von "/ redmine" oder "/ redmine_networked"). Also keiner dieser Links wird funktionieren. Wenn nginx eingerichtet wurde, alle '/' URLs an Redmine umzuleiten, wäre dies kein Problem. Der folgende Hack geht davon aus, dass dies nicht der Fall ist.

Damit Redmine auf die konfigurierten URLs verweist, muss die Datei config/environment.rb bearbeitet werden.

Hier ist der Hack:

> docker exec -it <redmine_container> bash 
redmine> cd config 
# We're going to install vim (this is a hack) 
redmine> apt-get update 
redmine> apt-get install vim 
redmine> vim environment.rb 

Ändern Sie die folgenden Zeilen am Ende Ihrer config/environment.rb

Initialize the Rails application Rails.application.initialize! 

zu

RedmineApp::Application.routes.default_scope = "/redmine" 
Initialize the Rails application Rails.application.initialize! 
redmine> exit 
> docker restart <redmine> (or just kill other docker process and run docker up again) 
0

Sie können nginx proxy container verwenden. Nginx-Proxy richtet einen Container ein, auf dem nginx und docker-gen ausgeführt werden. docker-gen generiert Reverse-Proxy-Konfigurationen für nginx und lädt nginx neu, wenn Container gestartet und gestoppt werden.

ist es bequemer, dann manuelle Konfiguration nginx