2017-06-22 3 views
0

J'ai essayé pendant plusieurs jours consécutifs de configurer un conteneur nginx s'exécutant sur Openshift, et jusqu'à présent, il ne fonctionnait pas.Exécution de nginx en tant qu'utilisateur non root sur Openshift et écoute sur le port 80

J'ai lu sur l'utilisation d'un utilisateur non-root pour des raisons de sécurité. Cependant, soyez root ou utilisateur non root, OpenShift ne me permet pas de créer une liaison dans le conteneur sur le port 80.

2017/06/22 21:18:57 [emerg] 1#1: bind() to 0.0.0.0:80 failed (13: Permission denied) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 

Sur ma machine locale, je peux lier avec succès à des ports plus élevés sur le contenant (8081 pour exemple), puis créez une carte pour l'accès dans la machine hôte (docker run --rm -d -p 9000:8081 mynginx). De cette façon, je peux atteindre le site Web avec succès sur l'adresse de l'hôte localhost:9000, mais je n'ai aucune ideia comment je pourrais réaliser quelque chose de similaire sur openshit. Je souhaite pouvoir déployer mon image avec l'utilisateur non-root et l'écoute nginx sur un port supérieur (8081), en même temps que openshift transmet tout le trafic entrant pour le port 80 du serveur au port 8081 du conteneur (nginx). Ma configuration actuellement est la suivante:

Dockerfile:

FROM nginx:alpine 

COPY nginx.conf /etc/nginx/nginx.conf 
COPY dist /usr/share/nginx/html 

RUN chmod -R 777 /var/log/nginx /var/cache/nginx /var/run \ 
    && chgrp -R 0 /etc/nginx \ 
    && chmod -R g+rwX /etc/nginx \ 
    && rm /etc/nginx/conf.d/default.conf 

EXPOSE 8081 

et mon fichier nginx.conf:

worker_processes 4; 
error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 

events { worker_connections 1024; } 

http { 

    ssl_session_cache shared:SSL:10m; 
    ssl_session_timeout 30m; 

    #See http://blog.argteam.com/coding/hardening-node-js-for-production-part-2-using-nginx-to-avoid-node-js-load 
    proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m; 
    proxy_temp_path   /var/tmp; 
    include     mime.types; 
    default_type   application/octet-stream; 
    sendfile    on; 
    keepalive_timeout  65; 

    gzip     on; 
    gzip_comp_level   6; 
    gzip_vary    on; 
    gzip_min_length   1000; 
    gzip_proxied   any; 
    gzip_types    text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
    gzip_buffers 16 8k; 

    server { 
    listen  8081; 
    server_name localhost; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html; 
     expires -1; 
     add_header Pragma "no-cache"; 
     add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
     try_files $uri$args $uri$args/ $uri $uri/ /index.html =404; 
    } 
    } 
} 

Obs: le Deploy se fait automatiquement dans le processus de pipeline. J'utilise un custom docker image de gitlab qui s'occupe du déploiement à openshift. Cette image personnalisée utilise openshift origin CLI pour gérer le déploiement.

+0

Cette question semble être hors sujet car il ne s'agit pas de programmation ou de développement. Voir [Quels sujets puis-je poser à ce sujet?] (Http://stackoverflow.com/help/on-topic) dans le centre d'aide. Peut-être [Super User] (http://superuser.com/) ou [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/) serait un meilleur endroit à demander. – jww

+0

Voir aussi [Autoriser le processus non racine à se lier aux ports 80 et 443?] (Https://superuser.com/q/710253/173513) sur Super User. – jww

+0

Le message d'erreur nginx ne correspond pas au fichier de configuration nginx. Quelle est la sortie de 'oc debug dc/your-dc' dans le shell' nginx -V' – Aleksandar

Répondre

3

Utilisez le port 8080 pour écouter. Lorsque vous exposez le service pour le serveur Web en dehors d'OpenShift, la route externe utilisera le port 80 par défaut de toute façon et s'assurera que le trafic est routé vers le port 8080 de votre serveur Web en interne. Si vous contactez le service en interne à OpenShift, vous devrez le contacter sur le port 8080.

De plus, sachez qu'un générateur S2I pour nginx est disponible si tout ce que vous voulez faire est d'héberger des fichiers statiques.

Au minimum voir comment il fait les choses. Stack Overflow est un site de questions de programmation et de développement.