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