【问题标题】:Running nginx as non-root user on Openshift and listening on port 80在 Openshift 上以非 root 用户身份运行 nginx 并监听端口 80
【发布时间】:2017-06-22 21:50:41
【问题描述】:

我已经连续几天尝试配置一个运行在 Openshift 上的 nginx 容器,但直到现在都没有成功。

出于安全原因,我已经阅读了有关使用非 root 用户的信息。但是,无论是 root 用户还是非 root 用户,openshift 都不允许我在 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)

在我的本地机器上,我可以成功绑定到容器上更高的端口(例如 8081),然后创建一个映射以在主机机器中访问(docker run --rm -d -p 9000:8081 mynginx)。这样我就可以成功访问主机地址localhost:9000 上的网站,但我不知道如何在openshit 上实现类似的目标。

我希望我可以部署 我的镜像,非 root 用户和 nginx 在更高的端口 (8081) 上侦听,同时 openshift 将服务器端口 80 的所有传入流量转发到容器的端口 8081 ( nginx)。我目前的设置如下:

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:部署在管道过程中自动发生。我正在使用来自 gitlab 的 custom docker image 负责部署到 openshift。此自定义映像使用openshift origin CLI 处理部署。

【问题讨论】:

标签: security nginx docker openshift openshift-origin


【解决方案1】:

使用端口 8080 进行监听。当您在 OpenShift 之外公开 Web 服务器的服务时,外部路由无论如何都会默认使用端口 80,并确保流量在内部路由到 Web 服务器的端口 8080。如果在 OpenShift 内部联系服务,则需要在端口 8080 上联系它。

此外,请注意,如果您只想托管一些静态文件,则可以使用适用于 nginx 的 S2I 构建器。

至少看看它是怎么做的。

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 2018-11-20
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多