web-dev-qa-db-ja.com

リバースプロキシとしてnginxを使用してApache2を実行する

私の目標は、新しいUbuntu 16.04サーバーから安全な電子メールサービスを提供することです。これを行うには、リバースプロキシとしてnginxを実行してApache2をセットアップします。

私の当面の問題は、HTTPSを(まだ)使用しようとしていないにもかかわらず、Apacheが起動せず、SSL証明書が割り当てられていないと主張することです(この質問の最後にあるターミナルからの出力を参照)。

私の質問:

  • Apacheがローカルポートで実行されている場合、nginxがSSL証明書について知っているだけでは不十分ですか?
  • Apacheがローカルアドレスでリッスンを開始するために何をする必要がありますか?

ここに私がすべきことの理解があります。私の理解が間違っている箇所を指摘していただければ幸いです。

  • NginxとApache2をインストールする
  • 以下にnginxサーバーブロックを作成します。
    • ポート80(および443)でリッスンする
    • (ポート80からポート443へのトラフィックのリダイレクト)
    • (SSL認定を取得した取引)
    • PHPファイルに対する要求を127.0.0.1:8080のApacheに転送します
  • Apacheを次のようにセットアップします。
    • ポート8080でのみリッスンし、ポート443でではなく
    • SSL証明書を知らないままにする

私は一度に1つの問題に対処するのが好きなので、現在SSL証明書の質問を無視し、ポート80でのみリバースプロキシとしてnginxでApacheを実行しようとしています。


私が持っている設定ファイルは次のとおりです。

nginx

$ Sudo nano /etc/nginx/sites-available/webmail

server {
  listen   80;

  root /var/www/webmail/web;
  index index.php index.html index.htm;

  server_name webmail.mydomain.com;

  # Look for...
  # * the exact path
  # * a default (index.*) file, considering the path to be a directory
  # ... and if that fails:
  # * get the index.php script at the root to deal with the request

  location / {
    try_files $uri $uri/ /index.php;
  }

  # If the chosen path leads to a PHP fie:
  # * forward the request to Apache running at 127.0.0.1:8080
  # * after having modified certain headers

  location ~ \.php$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $Host;
    proxy_pass http://127.0.0.1:8080;
  }

  # If there are any Apache HT files in the chosen directory
  # ignore any direct requests for them

  location ~ /\.ht {
    deny all;
  }
}

Apache2

$ Sudo nano /etc/Apache2/sites-available/webmail.conf 

<VirtualHost 127.0.0.1:8080>
        ServerName webmail.mydomain.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/webmail/web
        <Directory "/var/www/webmail/web">
            Options FollowSymLinks
            AllowOverride All
        </Directory>

        ErrorLog ${Apache_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>

Apache2ポート

$ Sudo nano /etc/Apache2/ports.conf

Listen 127.0.0.1:8080

#<IfModule ssl_module>
#       Listen 443
#</IfModule>

#<IfModule mod_gnutls.c>
#       Listen 443
#</IfModule>

Apacheにポート443でリッスンするように明示的に要求していないことに注意してください。Apacheにポート443でリッスンするように指示する他の構成ファイルに別の場所がありますか?


プレースホルダーのPHPファイルとHTMLファイルを、予想される場所に示します。

index.php

$ Sudo nano /var/www/webmail/web/index.php

<?php
  echo "PHP from /var/www/webmail/web/index.php\n";
?>

index.html

$ Sudo nano /var/www/webmail/web/index.html

<html>
  HTML from /var/www/webmail/web/index.html
</html>

ブラウザでは、 http://webmail.mydomain.com/index.html へのリクエストは期待どおりに成功しますが、 http://webmail.mydomain.com/indexへのリクエストは成功します.php を実行すると、ファイルはダウンロードされ、実行されません。


Apache2を起動しようとするとどうなりますか。

$ Sudo /etc/init.d/Apache2 restart
[ ok ] Restarting Apache2 (via systemctl): Apache2.service.

$ Sudo service Apache2 status
* Apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/Apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/Apache2.service.d
           `-Apache2-systemd.conf
   Active: inactive (dead) since <Time>; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 16059 ExecStop=/etc/init.d/Apache2 stop (code=exited, status=0/SUCCESS)
  Process: 16043 ExecStart=/etc/init.d/Apache2 start (code=exited, status=0/SUCCESS)

systemd[1]: Starting LSB: Apache2 web server...
Apache2[16043]:  * Starting Apache httpd web server Apache2
Apache2[16043]: Action 'start' failed.
Apache2[16043]: The Apache error log may have more information.
Apache2[16043]:  *
Apache2[16059]:  * Stopping Apache httpd web server Apache2
Apache2[16059]:  *
systemd[1]: Started LSB: Apache2 web server.

Error.logの内容は次のとおりです。

$ Sudo nano /var/log/Apache2/error.log

[ssl:emerg] [pid 15943] AH02572: Failed to configure at least one certificate and key for myhostname.hostingservice.com:443
[ssl:emerg] [pid 15943] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[ssl:emerg] [pid 15943] AH02311: Fatal error initialising mod_ssl, exiting. See /var/log/Apache2/error.log for more information

(これはvar/log/Apache2/error.logにあり、これ以上の情報はありません。)

何が欠けていましたか?


注:このサーバーの主な目的は、Meteorアプリを配信することです。 Phusion PassengerとNginxを使用してこれを行うことにしました。電子メールサービスに加えて、ApacheはWordPressサイトの配信にも使用されます。

2
James Newton

私は今それを機能させています。 /etc/Apache2/sites-disabled/default-ssl.confの削除を怠っていたため、Apacheは必要のない安全なサイトを実行しようとしていました。

その後、Sudo certbot --nginxを使用してNginxの証明書を取得しましたが、現在はすべてが安全に機能しています。

0
James Newton