CentOS 6.5 nginx+tomcat+ssl配置
本文档用于指导在centos 6.5下使用nginx反向代理tomcat,并在nginx端支持ssl。
安装nginx。参见centos 6 nginx安装。
ssl证书申请。参见腾讯ssl证书申请和配置或[使用certbot为站点添加https支持]。
安装tomcat。目前使用的版本为8.x。一般使用以下版本:点击下载8.5.x
nginx 反向代理以及ssl配置
这里仅介绍片段,例子如下,以letsencrypt证书为例(腾讯证书配置参见https://cloud.tencent.com/document/product/400/4143):
upstream tomcat {
server 127.0.0.1:8080 weight=1;
}
server {
server_name xxx.com;
charset utf-8;
location / { proxy_http_version 1.1; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; proxy_set_header connection ""; proxy_set_header x-forwarded-proto https; proxy_redirect off; client_max_body_size 100m; client_body_buffer_size 256k; proxy_connect_timeout 60; proxy_send_timeout 30; proxy_read_timeout 30; proxy_buffer_size 8k; proxy_buffers 4 64k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_pass http://tomcat; } error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } listen 443 ssl; # managed by certbot ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem; # managed by certbot ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem; # managed by certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by certbot
}
定义后端服务器。这里未举例负载均衡。
upstream tomcat {
server 127.0.0.1:8080 weight=1;
}
定义虚拟服务器
这里主要需要注意ssl证书的配置,以及代理部分的header设置,其影响tomcat端获取真实客户端ip、请求协议等,在未恰当配置的情况下可能造成获取的ip是nginx服务器的ip以及造成资源跨域问题。
tomcat配置
在nginx配置ssl证书的情况下,tomcat配置文件中不需要另行配置ssl证书,但需要获取nginx设置的请求头等信息。以下配置中的端口视具体情况配置。
将原本注释的8080 connector恢复,并改成如下
<connector port="8080" protocol="http/1.1"
connectiontimeout="20000"
redirectport="443"
proxyport="443"/>
在host标签内添加如下(如果已存在则忽略)
其中%h用于显示客户端ip,但是在代理模式下显示的是nginx的ip,可考虑将 "%h" 修改为 "%{x-real-ip}i" 即可获取到nginx请求头中已配置的客户端ip。
<valve classname="org.apache.catalina.valves.accesslogvalve"
directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t %r %s %b" />
获取真实ip,其中httpsserverport在nginx使用默认443端口时不需添加,否则应当指定。
<valve classname="org.apache.catalina.valves.remoteipvalve"
remoteipheader="x-forwarded-for"
remoteipproxiesheader="x-forwarded-by"
protocolheader="x-forwarded-proto"
protocolheaderhttpsvalue="https" httpsserverport="7001"
/>