文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

该问题的最终解决离不开公司大拿whs先生的指点,先表示感谢。

某项目的geoserver发布在一台linux上,端口为8082。使用Nginx对该geoserver服务(包括其他服务)做了一个转发代理,Nginx监听的端口是8081。由于8082端口没有对外开放,所以用户只能访问该8081端口进行访问。

由于系统与Geoserver的对接是直接基于OGC服务对接,所以一切正常,但是,用户依然发现对于Geoserver服务网站的访问却存在两个问题:

a.通过8081代理端口访问Geoserver网站,图层无法直接预览。

b.通过8081代理端口访问Geoserver时,如果不加上斜杠(/),则会报空指针异常错误。

2.问题一:Geoserver服务无法预览问题

2.1问题排查过程

点击预览时录制脚本:

可见本应是8081端口请求变成了默认的80端口,导致样式等文件无法加载,从而出现预览为空。跟踪源码,发现URL的获取方式为:

再查看目前Nginx的配置为:

可见,此处获取到的URL仅为浏览器输入地址的IP,而没有端口号,所以出现了脚本中默认80端口的问题。加上端口配置,重启Nginx服务,解决。

配置修改为:

重启Nginx操作:

2.2关于proxy_set_header参数的理解

其语法规则为:

语法:proxy_set_header field value;默认值:

proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

上下文:http, server, location

其作用为:

允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。

对上面问题出现我们可以这样理解:当使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的。

3.问题二:浏览器输入首页访问地址不带斜杠报错问题(http://ip:8081/geoserver报错)

3.1.一个奇怪的现象

首先,我在本地单独发布了一个Geoserver测试该问题,发现即使我输入不带斜杠,访问时浏览器也会为我自动加上斜杠访问。而服务器上的Geoserver则不会。

最开始怀疑为浏览器自身补全功能,但是这又无法解释访问云上地址时不补全现象。最后通过查资料确定为如下情况导致:

以访问http://ip:8081/geoserver为例子,在windows 系统上,一般如果服务器如果识别目录有个名称是geoserver ,但是根目录有文件夹为geoserver(没有文件名为geoserver) 时,他们会自动给目录加斜杠。但是,如果是linux 系统则不会,linux 系统会把它作为文件处理(不会以目录形式处理),而是直接就打开geoserver文件,所以不会加上斜杠。

因为服务器为linux系统,所以不会自动加上斜杠。

3.2从报错信息排查起

3.2.1正常情况下,带/时跳转的原理

Geoserver的web.xml中有如下配置:

<welcome-file-list>

<welcome-file>/index.html</welcome-file>

</welcome-file-list>

所以带上/时,会自动跳转至index.html页面,而

index.html中有:

于是请求再度调转为:http://192.168.56.104:8081/geoserver/web/,进入Geoserver首页。

3.2.2没有按照套路走,报错发生的原因在哪里

我们再看web.xml中的配置:

  此时因为匹配规则是/*,所以所有请求要先经过过滤器之后,才会走到欢迎页面设置,查看源码发现:

  

3.3解决方法

经过认真思考,有两种解决方案:

一种是对Nginx配置进行针对性优化;

一种方案是对Geoserver升级。

以下分段进行分别描述。

4.针对问题二:Nginx配置优化

4.1需求描述

整理需求为:我们需要实现在直接访问Geoserver(不带/)时转发自动加上/。但是针对Geoserver/(带上/)时转发不再自动加上/(//现象会导致访问404问题)。

查找资料,Nginx的rewrite机制可以非常好的解决该需求:

和apache等web服务软件一样,Nginx的rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

4.2Nginx相关配置总结

4.2.1语法规则

其语法规则为:

rewrite    <regex>    <replacement>    [flag];

关键字      正则       替代内容       flag标记

关键字:其中关键字error_log不能改变

正则:perl兼容正则表达式语句进行规则匹配

替代内容:将正则匹配的内容替换成replacement

flag标记:rewrite支持的flag标记

flag标记说明:

last  #本条规则匹配完成后,继续向下匹配新的location URI规则

break  #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

4.2.2执行顺序

a.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)

       b.执行location匹配

       c.执行选定的location中的rewrite指令

       如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件

如果循环超过10次,则返回500 Internal Server Error错误

4.2.3正则表达式规则

. : 匹配除换行符以外的任意字符

? : 重复0次或1次

+ : 重复1次或更多次

* : 重复0次或更多次

\d :匹配数字

^ : 匹配字符串的开始

$ : 匹配字符串的介绍

{n} : 重复n次

{n,} : 重复n次或更多次

[c] : 匹配单个字符c

[a-z] : 匹配a-z小写字母的任意一个

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

4.2.4常用变量

$args : #这个变量等于请求行中的参数,同$query_string

$content_length : 请求头中的Content-length字段。

$content_type : 请求头中的Content-Type字段。

$document_root : 当前请求在root指令中指定的值。

$host : 请求主机头字段,否则为服务器名称。

$http_user_agent : 客户端agent信息

$http_cookie : 客户端cookie信息

$limit_rate : 这个变量可以限制连接速率。

$request_method : 客户端请求的动作,通常为GET或POST。

$remote_addr : 客户端的IP地址。

$remote_port : 客户端的端口。

$remote_user : 已经经过Auth Basic Module验证的用户名。

$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme : HTTP方法(如http,https)。

$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。

$server_name : 服务器名称。

$server_port : 请求到达服务器的端口号。

$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri : 与$uri相同。

4.2.5动态变量参数

$1-$9存放着正则表达式中最近的9个正则表达式的匹配结果,这些结果按照子匹配的出现顺序依次排列。

       $1 代表的是匹配的第一个结果。

       括号表示的是表达式定义的“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个)
上面的表达式有2个匹配组 (\w+)  和 (.*) 所有后面可以用 $1 和 $2 来用

       比如例子^/(\w+)/(.*)$ /$1/index.php last;

       对应为:/abc123/bcdfda 
=>   /abc123/index.php

4.3解决该问题的最终配置

5.针对问题二:Geoserver升级

进入Geoserver下载官网进行学习:http://geoserver.org/download/

  由于公司标准运行环境为jdk1.7.x,所以主要对Geoserver2.8.x和Geoserver2.9.x进行了对比研究,总结如下:

5.1.运行环境

a. 
 2.9.x系列虽然描述为compatible with Java 8,个人理解为jdk7和jdk8应该都可以运行。
但是,分别在jdk1.7._067和云上的1.7._079上测试过,不可运行:

b.在2.8.X系列上进行了相关测试,均可以支持jdk1.7.x系列。

5.2.geoserver2.8.5版本的优点

 

总结优化即是:强化了三维服务支持、集成了更多(最新)的插件、针对某些特殊情况下的数据发布(如局域网共享文件安全机制)导致的闪退等问题进行了修复。

公司主要用到的基于本地矢量数据或者PG数据的WMS、WFS服务没有特殊说明的优化和改动。

但是geoserver的代码架构还是做了不少变化。

同时,针对不带斜杠访问报错问题,2.8.5上也做了优化:

5.3.基于城管业务的测试

a.基于公司云上一键安装环境进行测试,目前部件展示、I查询、网格查询正常:

b基于PG测试,也是正常。

5.4.但是,有一个小缺点

整个2.8.x系列,在版本chrome 63.0.3239.132上,geoserver平台在某些弹出框上会出现内容为空。但是IE(9以上)没有这个问题。考虑到这类手动操作不常见,不影响工程同事使用。

6.学习上的一点感慨

技巧可以规避问题,知其所以然才可以解决问题。

                    -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                    

Nginx+Geoserver部署所遇问题总结的更多相关文章

  1. Flask + WSGI + Nginx 云部署

    这几天学着用flask写一些rest api,然后部署到云上.这个过程虽然网上有很多的教程,但还是遇到不少的问题! 采用flask的原因是因为它比较容易上手吧.用flask有专门restful api ...

  2. nginx上部署python web

    nginx上部署python web http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

  3. Nginx上部署HTTPS

    Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev,且ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/, ...

  4. nginx服务部署 说明

    第1章 常用的软件 1.1 常用来提供静态服务的软件   Apache :这是中小型Web服务的主流,Web服务器中的老大哥,   Nginx :大型网站Web服务的主流,曾经Web服务器中的初生牛犊 ...

  5. 在nginx上部署vue项目(history模式);

    在nginx上部署vue项目(history模式): vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想has ...

  6. Diango + uwsgi + nginx 项目部署(可外网访问)

    自己通过nginx uwsgi 部署django项目,查询了很多资料,遇到了很多问题,最终完成了部署,趁着心情愉悦,写个随笔,为曾像我一样苦寻解决方案的小伙伴们提供些思路. 安装Nginx: #安装n ...

  7. [Redmine] Centos5上安装Redmine3.0+nginx+thin部署

    项目管理的需要所以安装Redmine,其实wiki放在上面也不错的. 首先是安装,ruby应用第一次装,把坑记住. nginx, mysql是已经安装好的,只需要配置, 结合nginx的部署方式很多, ...

  8. 填坑!!!virtualenv 中 nginx + uwsgi 部署 django

    一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...

  9. centos下安装nginx并部署angular应用

    注意:直接yum安装的nginx有问题,不能直接安装,因为centos默认库里面没有nginx.如果安装过程中出现一些文件夹或者文件找不到的话,应该是你的nginx的版本没有安装对.最效率的办法是删除 ...

随机推荐

  1. MongoDB批量导入及简单的性能优化

    今天简单分享一下MongoDB使用过程中的一些性能优化,其实并不只适用MongoDB,其他数据库多少也可适用. 首先先随机导入一千万条数据.这里我分段导入的,因为mongo的BsonDocument一 ...

  2. Machine Learning - week 4 - 编程练习

    = X' * (h - y) LrCostFunction 与上一周的有什么不同? 与 week3 的 costFunctionReg 是一样的.Week3 中参考答案没有排除 theta 第一行,但 ...

  3. 基本命令行操作1(java编译)

    1. 设置环境变量,具体:https://www.cnblogs.com/shinge/p/5500002.html "cd + 文件名" 可进入指定文件,"cd..&q ...

  4. 浴室沉思:聊聊DAL和Repository

    这是一个由DDD群引发的随笔 在写了上一篇随笔<关于ORM的浴室沉思>后一些朋友私聊我,很多刚接触DDD的朋友会对Repository(仓储层)这东西有点疑惑,为什么要叫仓储层?是不是三层 ...

  5. BZOJ:4333: JSOI2012 智者的考验

    4333: JSOI2012 智者的考验 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 68  Solved: 18[Submit][Status][ ...

  6. POJ 2370 Democracy in danger(简单贪心)

    Democracy in danger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3388   Accepted: 25 ...

  7. [51nod1206]Picture

    给你一坨矩形,问这些矩形组成的所有多边形的周长之和. 分别求竖着的边和横着的边. 离散化后线段树,维护当前行(或者列)有多少没在多边形里的,添加矩形就变成添加.删除线段. 每次加线段或删线段时累加一下 ...

  8. 连连看(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  9. git工作流程一览

    Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上.协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件 ...

  10. Spark算子--foreach和foreachPartition

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/6776fe93f754daf60d00d2cb509422a1.html foreach和foreachPar ...