部署集成
2021/10/28大约 2 分钟
部署集成
一般的后台系统关系一般比较复杂,需要集成的内容特别多.有些事情适合在开发阶段搞定,有些事情应该要在部署的时候搞定.
关于跨域
在后台应用的开发过程中,我们经常会遇到跨域问题,通常的解决方式是,使用各种后台和前端技术,来避免跨域问题.
而本质上来看,跨域问题是一个非常典型的部署问题,完全没必要使用开发的手段来解决.
下图是常见的部署示例,推荐使用contextPath来进行反向代理以后,进行转发. 
提示
- 所有的请求都被转发以后,从浏览器角度看,就是后台的一个web服务,这个服务内使用多少个进程来部署,浏览器完全不知道,也不需要知道.所以,前端的集成压根不用考虑怎么跨域,正常打开一个请求就结束了...
- 使用反向代理的好处是,所有的机器都是用同样的域名和端口,可以共享cookie了
- 通过反向代理方式进行部署的时候,不能使用request.getRemoteAddr()获得真实的访问ip了,需要额外的开发支持
- 这种部署方式,对于SSO来说,也提高了便利性,因为可以通过域名传递cookie了
常见的nginx配置
server {
listen 80;
server_name 自己整个域名;
access_log /var/log/nginx/external_access.log main;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 30;
proxy_read_timeout 30;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 20m;
add_header X-Cache "$upstream_cache_status from $server_addr";
location ~ ^/favicon.ico {
root /etc/nginx/html;
}
location ~ ^/app1 {
rewrite ^((?!\.).)*$ /app1/index.htm break;
proxy_pass http://app1_stream;
}
location ~* ^/app2 {
rewrite ^((?!\.).)*$ /app2/index.htm break;
proxy_pass http://app2_stream;
}
}
upstream app1_stream {
ip_hash;
server localhost:8360 max_fails=3 fail_timeout=2;
}
upstream app2_stream {
ip_hash;
server localhost:8117 max_fails=3 fail_timeout=2;
}HTTPS支持
在java的应用里面,类似Tomcat,Jetty都是可以单独发布HTTPS服务的,但是一般情况下,我们会很少使用应用容器来发布HTTPS服务,还是借助于反向代理,比如nginx.
主要原因入下
- 使用HTTP服务器来发布HTTPS服务,实在太简单
- 开发不应该涉足安全领域,比如证书....

nginx的HTTPS的配置
server {
listen 443 ssl;
server_name 域名;
ssl_certificate /etc/nginx/ssl/2729628_backsample.9istock.com.pem;
ssl_certificate_key /etc/nginx/ssl/2729628_backsample.9istock.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}注意
要满足上述的扩展性,在应用开发过程中,开发的应用程序如果涉及到跳转,不能使用request.getSchema(),request.getHost()等api进行对URL的拼接.
