70292


**やりたいこと：**  
`https://example.com/siteA` nextcloud  
`https://example.com/siteB` ASP.NET Core (Kestrel)  
この2つを同時に稼働させたい。

**現状：**  
この状態だと、siteAへのHTTPSによる接続は上手く行き、ちゃんと稼働しています。  
siteBへの接続は404NotFoundです。  
この時、Kestrelを直接curlで接続してみると、想定していた出力がされていることを確認しました。

次に、siteB.confの<VirtualHost *:80>を<VirtualHost *:443>に変更すると、今度はsiteBが正しく表示され、  
siteAが404NotFoundで表示されなくなります。

443にしたときに、443ポートへの接続がくるとsiteB側の設定だけが適用されている様に見えるのですが、実際の所、どうしてこうなるのかがわかっていません。  
どうにか両立するようにできないでしょうか？

**システム**  
Apache/2.4.6 (CentOS)  
dotnet: 3.1.401  
CentOS Linux release 7.8.2003 (Core)

## /conf.d/rewrite.conf

[code]

    <ifModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{HTTPS} off [OR]
            RewriteCond %{HTTP_HOST} ^www\. [NC]
            RewriteRule ^ https://hogehoge.com%{REQUEST_URI} [L,NE,R=301]
    </ifModule>
    
[/code]

## /conf.d/siteA.conf

[code]

    Https
    <VirtualHost *:80>
      ServerName hogehoge.com
      ServerAdmin admin@hogehoge.com
      DocumentRoot /home/www/html/siteA/
      <directory /home/www/html/siteA>
        Options +FollowSymLinks
    #    Options FollowSymLinks MultiViews
        AllowOverride All
    
        <IfModule mod_dav.c>
          Dav off
        </IfModule>
        <IfModule mod_headers.c>
          Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
        </IfModule>
    
        SetEnv HOME /home/www/html/siteA
        SetEnv HTTP_HOME /home/www/html/siteA
      </directory>
    </VirtualHost>
    
[/code]

## /conf.d/siteB.conf

[code]

    <VirtualHost *:80>
            ServerName hogehoge.com
            DocumentRoot /home/www/siteB
            <Directory "/home/www/siteB">
                    Require all granted
            </Directory>
    
            ProxyPreserveHost On
    
            ProxyPass /siteB http://localhost:5000/siteB
            ProxyPassReverse /siteB http://localhost:5000/siteB
            SSLEngine on
            SSLEngine on
            SSLProtocol all -SSLv2
            SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
            SSLCertificateFile zzz/ssl.crt/xxxxxx.rcrt
            SSLCertificateKeyFile zzz/ssl.key/xxxxxx.key
            SSLCertificateChainFile zzz/ssl.crt/yyyyy.crt
    </VirtualHost>
    
[/code]

* * *

2020/09/09  
追記  
発想を変えることにしました。  
現在nextcloudが稼働しているApacheサーバをPHP用アプリケーションサーバとみなして、nginxサーバを新たにリバースプロキシサーバに当てました。

Apacheを停止後、Listenに新たなHTTP,HTTPS用ポートを割り当て。  
Nginxサーバをインストール後、

[code]

        location /siteA{
            proxy_pass         http://localhost:5003;
            ...
        }
        location /siteB{
            proxy_pass         http://localhost:5000;
        }
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
    
        }
    
[/code]

この構成でNginx,Apache,kestrelをそれぞれ起動した所、siteA、siteBの双方に想定していたアクセスを得る事ができました。  
nextcloud側はSSL設定していないのでBadRequestで弾かれますが、nginx側で設定していないので想定通りの動作と言えます。  
localhostで稼働するバックグラウンドサーバのSSL設定等まだ考える必要はありますが、現在この方向で検証しています。


CC BY-SA 4.0
2020-09-08T10:00:53.417
70227
2020-09-10T14:30:34.390
2020-09-09T05:04:58.573
41816
41816
question
apache
既存のPHPアプリ(nextcloud)と新しく作るASP.NET Core (Kestrel)が共存できない


望んでいた動作にすることができました。  
以下、概要と設定ファイルです。

Apacheでリバースプロキシを行う場合、VirtualHostはホストとポートで切り分けるための仕組みなので、  
正しくはサブドメインで切り分けるのが正しいと判断しました。  
そこで、新たにリバースプロキシサーバとしてNginxを構築し、その配下にApacheとKestrelをぶら下げることにしました。  
Apacheはポート変更とSSLの停止を行っています。SSL化はプロキシにまとめました。

実際に試してみた所、動作自体はすぐにできました。  
問題点としては、プロキシ側で適切なHTTPヘッダーを設定してあげないとセキュリティ的に問題があったり、  
読み込めない画像があったりだったので、その辺の対応も入っています。

**nginx/conf.d/server.conf** (default.conf)

[code]

    upstream siteB{
        #kestrel
        server localhost:5000;
    }
    
    upstream siteA{
        #apache
        server localhost:5003;
    }
    server {
        listen     *:80;
            add_header Strict-Transport-Security max-age=15768000;
            return     301 https://$host$request_uri;
    }
    
    server {
        listen       *:443 ssl;
        server_name  hogehoge.com;
    
        charset utf-8;
    
        ssl_certificate           /xxx/yyyy/zzzz/ssl.crt/nginx.pem;
        ssl_certificate_key       /xxx/yyyy/zzzz//ssl.key/server.key;
        ssl_protocols             TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers               "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
        ssl_ecdh_curve            secp384r1;
        ssl_session_cache         shared:SSL:10m;
        ssl_session_tickets       off;
        ssl_stapling              on; 
        ssl_stapling_verify       on; 
    
        location /siteB {
            proxy_pass         http://siteB;
            limit_req zone=one burst=10 nodelay;
            keepalive_timeout 75s;
    
            add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
            add_header X-Frame-Options DENY;
            add_header X-Content-Type-Options nosniff;
            add_header  Content-Security-Policy " default-src 'self' data: gap: ; form-action 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';frame-src 'self' *.twitter.com *.facebook.com www.youtube.com; img-src 'self' * data: blob:; media-src 'self' *.youtube.com; style-src 'self' 'unsafe-inline' https://use.fontawesome.com https://fonts.googleapis.com; font-src 'self' * data: blob: fonts.gstatic.com https://use.fontawesome.com; object-src 'none' ";
        }
        location /siteA {
            proxy_pass         http://siteA;
            limit_req zone=one burst=10 nodelay;
            keepalive_timeout 75s;
                add_header Referrer-Policy "no-referrer" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header X-Download-Options "noopen" always;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-Permitted-Cross-Domain-Policies "none" always;
                add_header X-Robots-Tag "none" always;
                add_header X-XSS-Protection "1; mode=block" always;
                add_header  Content-Security-Policy " default-src 'self' data: gap: ; form-action 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' * data: blob:; media-src 'self' *.youtube.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; object-src 'none' ";
        }
        location /otherApp {
            proxy_pass    http://localhost:5003;
            limit_req zone=one burst=10 nodelay;
                add_header Referrer-Policy "no-referrer" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header X-Download-Options "noopen" always;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-Permitted-Cross-Domain-Policies "none" always;
                add_header X-Robots-Tag "none" always;
                add_header X-XSS-Protection "1; mode=block" always;
        }
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
    
        }
    
        #
        #以下、省略
        #
    }
    
    
[/code]

**nginx/proxy.conf**

[code]

    proxy_redirect          off;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
    
[/code]

**nginx/nginx.conf**

[code]

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/proxy.conf;
        include       /etc/nginx/mime.types;
        limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
        server_tokens off;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
    
[/code]


CC BY-SA 4.0
2020-09-10T14:30:34.390
70292
2020-09-10T14:30:34.390
41816
70227
answer