CentOS Stream 8でNginxとTomcatを共存させる手順

|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|

CentOS Stream 8にNginx1.14をインストールしてみた。

80ポートはApache httpdがlistenしているので、Nginxは7080ポートをlistenするようにしたい。7080ポートは、空き状況をみてローカルに適当に決めた。httpdのVirtualHostから、特定のルート(/php)のときのみNginxに飛ばすようにしたい。現在、httpdはTomcatと連携してhttpsで利用しているため、Tomcatと共存できるようにしたい。

ネット情報では、nginx(80) --> httpd(8080) --> ajp(8009) --> tomcat(8443) の流れでの提示が多いが、既存のhttpdとTomcatを壊したくなかったので、以下のような流れにしてみる。
```
httpd(80) --> RewriteEngine(443)　-->
	if (特定のルート /php のとき){
		nginx(7080)
	} else {
		ajp(8009) --> tomcat(8443)
	}
```

## Nginx1.14のインストール

Nginx1.14をインストールする。
```
$ dnf list nginx
nginx.x86_64         1:1.14.1-9.module_el8.0.0+1060+3ab382d3          @appstream
$ dnf install nginx
```
httpサービスを登録し、起動する。
```
$ firewall-cmd --list-all
$ firewall-cmd --add-service=http --permanent
$ firewall-cmd --reload
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client http imap mysql pop3 smtp smtp-submission vnc-server
  ports: 8080/tcp 8443/tcp 8009/tcp
  protocols: 

$ systemctl start http
$ systemctl status http
```
Nginxサービスは、初期状態で起動すると、80ポートがhttpdと衝突してエラーになる。
```
$ systemctl start nginx
$ systemctl status nginx
$ more /var/log/nginx/error.log
```
Nginxの設定を変更し、サービス起動する。80ポートではなく、7080ポートをlistenする。ルートには、作成したPHPを配置したディレクトリを指定する。
```
$ ls /etc/nginx
$ vi /etc/nginx/nginx.conf
    server {
#       listen       80 default_server;
        listen       7080 default_server;
#       listen       [::]:80 default_server;
        listen       [::]:7080 default_server;
        server_name  _;
#       root         /usr/share/nginx/html;
        root         /opt/php74/webapps;

$ nginx -t
$ vi /etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

$ vi /etc/php-fpm.d/www.conf
;user = apache
user = nginx
;group = apache
group = nginx

$ systemctl start php-fpm
$ systemctl enable php-fpm

$ systemctl start nginx
$ systemctl status nginx
```
## httpdの設定変更

httpd.confを修正し、httpdを再起動する。私の環境では、VirtualHostで *:80 は *:443 にRewriteEngineで書き換えている。vhost-xxx-ssl.confのようなファイルに記述している。それを編集して、/phpが指定のときはNginx(7080)へ、その他のときはTomcat(8009)へ飛ぶように変更する。Tomcatのドキュメントルートは /opt/tomcat9/webapps/ にしている。Nginxのルートは /opt/php74/webapps/ にしてみた。
```:vhost-xxx.conf
<VirtualHost *:80>
ServerName kankeri.com
...
RewriteEngine on
RewriteCond %{SERVER_NAME} =kankeri.com [OR]
RewriteCond %{SERVER_NAME} =www.kankeri.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
...
</VirtualHost>
```
```:vhost-xxx-ssl.conf
<VirtualHost kankeri.com:443>
...
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass        /php   http://localhost:7080/
ProxyPass 		 /      ajp://localhost:8009/
ProxyPassReverse /php/  http://localhost:7080/

SSLCertificateFile /etc/letsencrypt/live/kankeri.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/kankeri.com/privkey.pem
...
</VirtualHost>
```
以下のURLでアクセスすると、それぞれ、phpやjspが機能する。
```
http://kankeri.com/php/			--> /opt/php74/webapps/
http://kankeri.com/				--> /opt/tomcat9/webapps/
```
|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|