2017-08-24 16 views
0

他のコンポーネント(サーバ)にリクエストを転送するためにプロキシとしてnginxを使用しています。Docker nginxエラー:openssl:コマンドが見つかりません

nginxを含む各コンポーネントは、「nginx-proxy」、「dashboard-server」、「backend-server」(REST API)、「landing-server」のためのドッキング・コンテナを持っています。 (ランディングページ)。後者の3つのコンポーネントはすべてNodeJS Expressのサーバであり、私はコマンドdocker-compose buildを使用するときにエラーがないが、私はdocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -dでコンテナを起動したときにNodeJSコンテナは正常に動作しますが、nginxのコンテナはdocker-compose logs nginx-proxyを使用して私は、このエラーを与えて正常に動作し:

私が使用しています
Attaching to docker_nginx-proxy_1 
nginx-proxy_1  | /start.sh: line 5: openssl: command not found 
nginx-proxy_1  | Creating dhparams…\c 
nginx-proxy_1  | ok 
nginx-proxy_1  | Starting nginx… 
nginx-proxy_1  | 2017/08/23 23:27:20 [emerg] 6#6: 
BIO_new_file(“/etc/letsencrypt/live/admin.domain.com/fullchain.pem”) 
failed (SSL: error:02001002:system library:fopen:No such file or directory: 
fopen(‘/etc/letsencrypt/live/admin.domain.com/fullchain.pem’,‘r’) error:2006D080:BIO routines:BIO_new_file:no such file) 
nginx-proxy_1  | nginx: [emerg] 
BIO_new_file(“/etc/letsencrypt/live/admin.domain.com/fullchain.pem”) failed (SSL: error:02001002:system library:fopen: 
No such file or directory:fopen(‘/etc/letsencrypt/live/admin.domain.com/fullchain.pem’,‘r’)error:2006D080:BIO routines:BIO_new_file:no such file) 

は、nginxのサーバーが要求を処理するために開始されないためしかし、エラーConnectionのコマンドcertbot certonly --webroot -w /var/www/letsencrypt -d admin.domain.com -d api.domain.com -d www.domain.com -d domain.com結果はを拒否、SSL証明書の暗号化できるようにします。

私のnginxのDockerfile(nginxのプロキシ/ Dockerfile):

FROM nginx:1.12 

COPY start.sh /start.sh 
RUN chmod u+x /start.sh 

COPY conf.d /etc/nginx/conf.d 

COPY sites-enabled /etc/nginx/sites-enabled 

ENTRYPOINT ["/start.sh"] 

マイstart.shファイル(nginxのプロキシ/ start.sh):

#!/bin/bash 

if [ ! -f /etc/nginx/ssl/dhparam.pem ]; then 
    echo "Creating dhparams…\c" 
    openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 
    echo "ok" 
fi 

echo "Starting nginx…" 
nginx -g 'daemon off; 

マイdefault.confファイル(nginx-proxy/conf.d/default.conf):

include /etc/nginx/sites-enabled/*.conf; 

マイapi.confファイル(他の人が似ている)(nginxのプロキシ//api.confサイト対応):

server { 
    listen 80; 
    server_name api.domain.com; 

    location ^~ /.well-known/acme-challenge/ { 
     default_type "text/plain"; 
     root /var/www/letsencrypt; 
    } 

    location = /.well-known/acme-challenge/ { 
     return 404; 
    } 

    return 301 https://$host$request_uri; 
    } 


    server { 
    listen 443; 
    server_name api.domain.com; 

    ssl on; 
    ssl_certificate /etc/letsencrypt/live/api.domain.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/api.domain.com/privkey.pem; 

    ssl_session_timeout 5m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; 
    ssl_prefer_server_ciphers on; 

    ssl_session_cache shared:SSL:1m; 
    ssl_dhparam /etc/nginx/ssl/dhparam.pem; 

    client_max_body_size 0; 
    chunked_transfer_encoding on; 

    location ^~ /.well-known/acme-challenge/ { 
     default_type "text/plain"; 
     root /var/www/letsencrypt; 
    } 

    location = /.well-known/acme-challenge/ { 
     return 404; 
    } 

    location/{ 
     proxy_read_timeout 900; 
     proxy_pass_header Server; 
     proxy_cookie_path ~*^/.* /; 
     proxy_pass   http://backend-server:3000; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Port $server_port; 
     proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; 
     } 
    } 

任意のアイデア?

答えて

2

解決策が見つかりました。私のnginxのDockerfileで

は、私はその後、opensslコマンドが正常に働いていた

FROM nginx:1.12-alpine 

RUN apk update \ 
    && apk add openssl 


... 

を使用する必要がありました。

0

最初にに、opensslから/usr/bin/opensslまでのstart.shファイルを編集できます。 /usr/bin/opensslは存在しましたか?

第2のの場合、/etc/letsencrypt/live/api.domain.com/fullchain.pem/etc/letsencrypt/live/api.domain.com/privkey.pemファイルが存在するまで、nginxサーバーは起動しません。

したがって、443ポートを処理するサーバーブロックをすべて削除またはコメントし、80ポートを処理するサーバーブロックを保持します。あなたのapi.confは次のようになります:

server { 
    listen 80; 
    server_name api.domain.com; 

    location ^~ /.well-known/acme-challenge/ { 
     default_type "text/plain"; 
     root /var/www/letsencrypt; 
    } 

    location = /.well-known/acme-challenge/ { 
     return 404; 
    } 

    return 301 https://$host$request_uri; 
} 

次に、nginxサーバーを起動し、「Let's Encrypt certificate」を再試行してください。

+0

'' /start.sh:line 5:/ usr/bin/openssl:そのようなファイルやディレクトリはありません ''' –

+0

あなたのnginxを起動しましたか?私が言及したようなサーバー? 'ssl_dhparam'という行をコメントするだけで、なぜあなたのドッカーがopensslコマンドを後で実行できないのかを知ることができます。 –

+0

OK、/ usr/bin/opensslを使用して* .confファイルのSSLコードをコメントアウトするだけで、nginxサーバーが正しく起動します。しかし、SSLを正しく設定するには、今何をする必要がありますか? –

関連する問題