我已经连续几天尝试配置一个在 Openshift 上运行的 nginx 容器,但直到现在,还没有让它工作。
出于安全原因,我已经阅读了有关使用非 root 用户的信息。但是,无论是 root 用户还是非 root 用户,openshift 都不允许我在 80 端口的容器中创建绑定(bind)。
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)
在我的本地机器上,我可以成功地绑定(bind)到容器上的更高端口(例如 8081),然后在主机机器(
docker run --rm -d -p 9000:8081 mynginx
)中创建一个用于访问的映射。这样我就可以成功到达主机地址localhost:9000
上的网站了,但我不知道如何在 openshit 上实现类似的目标。我希望我可以部署 我的镜像与非 root 用户和 nginx 在更高的端口 (8081) 上监听,同时 openshift 将服务器端口 80 的所有传入流量转发到容器 (nginx) 的端口 8081 .我目前的设置如下:
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
和我的 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:部署在管道过程中自动发生。我正在使用 custom docker image从负责部署到 openshift 的 gitlab。此自定义图像使用 openshift origin CLI用于处理部署。
最佳答案
使用端口 8080 进行监听。当您在 OpenShift 之外公开 Web 服务器的服务时,外部路由无论如何都会默认使用端口 80,并确保流量在内部路由到 Web 服务器的端口 8080。如果在内部与 OpenShift 联系服务,您将需要在端口 8080 上联系它。
此外,请注意,如果您只想托管一些静态文件,则可以使用适用于 nginx 的 S2I 构建器。
至少看看它是如何做事的。
关于security - 在 Openshift 上以非 root 用户身份运行 nginx 并监听端口 80,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44709905/