https配置遇到的问题

系统环境:ubuntu
java8,tomcat8.5
在配置nginx、tomcat、https过程中,遇到的一系列问题。
特别说明:按照遇到问题的先后顺序,内容可能比较乱,但是每一个问题都是实际遇到并且解决了的。

nginx重新安装

之前安装的nginx,是没有支持https的,现在需要支持https,需要重新编译安装。

cd ~/nginx-1.13.12
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_modul
cp /usr/local/nginx/conf/nginx.conf ~/nginx.conf_backup
make
make install

各种小问题

DNS problem: NXDOMAIN looking up A for xxx.com

方法:直接ping 地址,注意,ping的地址,跟“xxx.com”要完全一致,假设前面有www,也要带上,有与没有“www”,是很大区别的。

nginx: [emerg] the “ssl” parameter requires ngx_http_ssl_module

解决:
sudo apt-get install openssl libssl-dev

安装参考

用Let’s Encrypt实现Https(Windows环境+Tomcat+Java)
ARP环境,在ubuntu环境下,可以参考下面的内容。

tomcat没有配置https却使用https请求,报错

org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens

因为tomcat默认只是支持http配置的,而直接使用https进行请求,所以报错。解决办法:使得tomcat支持https请求,即可。

tomcat启动报错:org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is not available

安装openssl、apr、apr-util,此部分完全参考参考地址中的第2个。

安装openssl

wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz
tar -zxf openssl-1.0.2o.tar.gz
cd openssl-1.0.2o
./config -fPIC --prefix=/usr/local/openssl-1.0.2o
make
make install

安装apr

安装apr,参考博文apr安装说明
下载地址:https://apr.apache.org/download.cgi
直接wget下载即可。
报错:xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
解决办法:apt-get install libexpat1-dev

wget http://mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gz
tar -zxvf apr-1.6.3.tar.gz
cd apr-1.6.3
./configure --prefix=/usr/local/apr
make
make install

安装apr-util

wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
vim /etc/ld.so.conf

编辑/etc/ld.so.conf文件,将include /usr/local/apr/lib/添加进入。

安装tomcat-native

tar -zxf tomcat-native.tar.gz
cd tomcat-native-1.2.8-src/native/
./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/lib/jvm/jdk1.8.0_162 --with-ssl=/usr/local/openssl-1.0.2o
make
make install

报错
javax.management.InstanceNotFoundException:com.alibaba.druid:type=DruidStatService
解决办法:修改tomcat的bin目录下的catalina.sh文件,在# OS specific support. $var _must_ be set to either true or false.下面增加JAVA_OPTS="-Ddruid.registerToSysProperty=true",修改之后,就是下面这样

# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS="-Ddruid.registerToSysProperty=true"
cygwin=false

然后重启tomcat。

启动tomcat时候,有报错:
javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService

启动报错

重新登录后,然后重新启动tomcat,报错了。但是之前是好的。错误具体信息如下:

[main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11AprProtocol-443]]
 org.apache.catalina.LifecycleException: Failed to initialize component [Connector[org.apache.coyote.http11.Http11AprProtocol-443]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:113)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:875)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:632)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:655)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:309)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: org.apache.catalina.LifecycleException: The configured protocol [org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is not available
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    ... 12 more

解决办法:将下面的命令,写到.bashrc中。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib

另外,从以下博客中得知

1.防止nginx转发丢失session,需要配置

在 location / {}中添加 proxy_cookie_path /XXX/ /;即

2.完全引用于下面的第3个链接
在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )?
在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:

request.getScheme()  //总是 http,而不是实际的http或https
request.isSecure()  //总是false(因为总是http)
request.getRemoteAddr()  //总是 nginx 请求的 IP,而不是用户的IP
request.getRequestURL()  //总是 nginx 请求的URL 而不是用户实际请求的 URL
response.sendRedirect( 相对url )  //总是重定向到 http 上 (因为认为当前是 http 请求)

如果程序中把这些当实际用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
配置 Nginx 的转发选项:

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;

配置Tomcat server.xml 的 Engine 模块下配置一个 Value:

Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/

配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。X-Forwarded-For 是为了获得实际用户的 IP。
这样以上5项测试就都变为正确的结果了,就像用户在直接访问 Tomcat 一样。

参考博文
[1]. 部署生产环境时踩到的一些坑https://www.cnblogs.com/waliwaliwa/p/7644253.html
[2].关于tomcat8启动报APR/native library which is not available的问题解决https://blog.csdn.net/felix_yujing/article/details/52385890
[3]nginx 代理https后,应用redirect https变成httphttps://www.cnblogs.com/davidwang456/p/6811982.html

展开阅读全文

没有更多推荐了,返回首页