nginx+tomcat配置ssl

wylc123 1年前 ⋅ 1057 阅读

反向代理

在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。

nginx做前端代理分发,tomcat处理请求。nginx反代tomcat实现https有二个方法。

一、nginx配置https,tomcat也配置https

1、nginx配置https

upstream https_tomcat_web {
  server 127.0.0.1:8443;
}
server {
  listen  443;
  server_name www.test.com;
  index index.html;
  root /var/www/html/test;
  ssl on;
  ssl_certificate /etc/nginx/go.pem;
  ssl_certificate_key /etc/nginx/go.key;
  ssl_session_timeout 5m;
  ssl_protocols SSLv2 SSLv3 TLSv1.2;
#  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;
  location ~ ^/admin {
   proxy_pass https://https_tomcat_web; //是https的
   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;
   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    8 64k;
   proxy_busy_buffers_size 64k;
   proxy_temp_file_write_size 64k;
  }
  error_page 404 /404.html;
  location = /40x.html {
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
  }
}
Markup

2、tomcat的https配置,配置文件server.xml

<Service name="Catalina">
 <Connector port="8001" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443" />
 <Connector port="8091"
 protocol="AJP/1.3"
 redirectPort="8443" />
//添加以下内容
 <Connector port="8443"
 protocol="HTTP/1.1"
 SSLEnabled="true"
 scheme="https"
 secure="false"
 keystoreFile="cert/gotom.pfx"
 keystoreType="PKCS12"
 keystorePass="214261272770418"
 clientAuth="false"
 SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256" />

 ..................省略....................
 </Service>
Markup

配置好后重新启动nginx,tomcat,就可以https访问了,这也是我现在采用的配置方式 。

二、nginx采用https,tomcat采用http

浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。

下面是详细的配置(Nginx 端口 80/443,Tomcat 的端口 8080):

1、nginx配置https

upstream https_tomcat_web {
  server 127.0.0.1:8001;
}
server {
  listen  443;
  server_name www.test.com;
  index index.html;
  root /var/www/html/test;
  ssl on;
  ssl_certificate /etc/nginx/go.pem;
  ssl_certificate_key /etc/nginx/go.key;
  ssl_session_timeout 5m;
  ssl_protocols SSLv2 SSLv3 TLSv1.2;
#  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;
  location ~ ^/admin {
   proxy_pass http://https_tomcat_web; //是http的
   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;
   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    8 64k;
   proxy_busy_buffers_size 64k;
   proxy_temp_file_write_size 64k;
  }
  error_page 404 /404.html;
  location = /40x.html {
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
  }
}
Markup

2、tomcat的http配置,配置文件server.xml

其中最为关键的就是 ssl_certificate 和 ssl_certificate_key 这两项配置,其他的按正常配置。不过多了一个 proxy_set_header X-Forwarded-Proto https; 配置。

tomcat配置:

<Service name="Catalina">
 <Connector port="8001" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="443" /> //在这里重新定向到了443端口

 <Connector port="8091"
 protocol="AJP/1.3"
 redirectPort="443" />

 ..................省略....................
 </Service>
Markup

上述的配置中没有什么特别的,但是特别特别注意的是必须有 proxyPort="443",这是整篇文章的关键,当然 redirectPort 也必须是 443。同时 <Value> 节点的配置也非常重要,否则你在 Tomcat 中的应用在读取 getScheme() 方法以及在 web.xml 中配置的一些安全策略会不起作用。

强制http转https

server {
    listen 80;
    server_name 你的域名或ip;

    rewrite ^(.*)$  https://$host$1 permanent;   #强制转https

    location ~ / {
      root /var/www/html/8080;
      index index.html index.php index.htm;
    }
}
Markup

重启nginx,tomcat,https就配置好了。不管是第一种方法,还是第二种方法,如果通过http,直接访问8001端口,浏览器都会提示你不安全的访问,因为本身是http,确被重定向到了https。
总结:
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

参考:

Nginx+Tomcat Https SSL部署方案

nginx https反向代理tomcat的2种实现方法

 

现在用的配置:

nginx.conf:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	#小说网站PC站
	server {
		listen       80;
		server_name  pcbook.songbin.top;

		#charset koi8-r;

		#access_log  logs/host.access.log  main;

		location / {
			root   html;
			index  index.html index.htm;
			proxy_pass http://pcbook.songbin.top:8088;
		}

		#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;
		}

		# proxy the PHP scripts to Apache listening on 127.0.0.1:80
		#
		#location ~ \.php$ {
		#    proxy_pass   http://127.0.0.1;
		#}

		# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
		#
		#location ~ \.php$ {
		#    root           html;
		#    fastcgi_pass   127.0.0.1:9000;
		#    fastcgi_index  index.php;
		#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
		#    include        fastcgi_params;
		#}

		# deny access to .htaccess files, if Apache's document root
		# concurs with nginx's one
		#
		#location ~ /\.ht {
		#    deny  all;
		#}
    }
	#小说网站手机站
	server {
			listen       80;
			server_name  mbook.songbin.top;

			#charset koi8-r;

			#access_log  logs/host.access.log  main;

			location / {
				root   html;
				index  index.html index.htm;
				proxy_pass http://mbook.songbin.top:8088/;
			}

			#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;
			}

			# proxy the PHP scripts to Apache listening on 127.0.0.1:80
			#
			#location ~ \.php$ {
			#    proxy_pass   http://127.0.0.1;
			#}

			# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
			#
			#location ~ \.php$ {
			#    root           html;
			#    fastcgi_pass   127.0.0.1:9000;
			#    fastcgi_index  index.php;
			#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
			#    include        fastcgi_params;
			#}

			# deny access to .htaccess files, if Apache's document root
			# concurs with nginx's one
			#
			#location ~ /\.ht {
			#    deny  all;
			#}
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    # 以下属性中以ssl开头的属性代表与证书配置有关,其他属性请根据自己的需要进行配置。
	server {
	 listen 80;
	 server_name www.songbin.top;
	 rewrite ^(.*)$ https://$host$1 permanent;   #将所有http请求通过rewrite重定向到https。
	 location / {
				root /var/www/html/8080;
				index  index.html index.htm;
			}
	}
    server {
        listen       443 ssl;  #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
        server_name  www.songbin.top;  #将localhost修改为您证书绑定的域名,例如:www.example.com。
        ssl_certificate      cert/2728492_www.songbin.top.pem; #将domain name.pem替换成您证书的文件名。
        ssl_certificate_key  cert/2728492_www.songbin.top.key; #将domain name.key替换成您证书的密钥文件名。

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers   ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #使用此加密套件。
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #使用该协议进行配置。
        ssl_prefer_server_ciphers  on;
		if ($scheme = http) {
			return 301 https://$host$request_uri;
		}
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host $http_host;
			proxy_set_header X-Forwarded-Proto https;
			proxy_redirect off;
			proxy_connect_timeout      240;
			proxy_send_timeout         240;
			proxy_read_timeout         240;
			# note, there is not SSL here! plain HTTP is used
			proxy_pass http://www.songbin.top:8080;
			proxy_redirect http:// https://;
			#proxy_set_header Upgrade $http_upgrade;
			#proxy_set_header Connection "upgrade";
        }
    }

}
Markup

server.xml:

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 80
    -->
	<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
			   redirectPort="443"/><!--proxyPort="443" -->

	<!--<Connector port="443" protocol="HTTP/1.1"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
				keystoreFile="cert/2728492_www.songbin.top.pfx"
				keystoreType="PKCS12"
				keystorePass="qavL05tX"
               clientAuth="false"
			   SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
				ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>-->

    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <!--<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>-->
	  <Host name="www.songbin.top"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
			<!--<Alias>mblog.songbin.top</Alias>-->
			<Valve className="org.apache.catalina.valves.RemoteIpValve"
                  remoteIpHeader="x-forwarded-for"
                  remoteIpProxiesHeader="x-forwarded-by"
                  protocolHeader="x-forwarded-proto"
            />
	<Context path="" debug="0" docBase="C:/softs/Java/Tomcat 8.0/webapps/mblog" reloadable="true"></Context>

      </Host>

	<!--<Host name="wxmall.songbin.top"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
	<Context path="" debug="0" docBase="C:/softs/Java/Tomcat 8.0/webapps/spider-0.0.1-SNAPSHOT" reloadable="true"></Context>

      </Host>-->
    </Engine>
  </Service>
</Server>
Markup


注意:本文归作者所有,未经作者允许,不得转载

更多内容请访问:IT源点
相关文章推荐

全部评论: 0

    我有话说: