简介:本资源是一份面向GIS初学者与Linux系统管理员的ArcGIS 10.1 for Server单机部署实操指南,聚焦Linux环境下从零完成服务安装、授权、启动到站点创建的全流程。内容覆盖安装前系统检查(含CheckPackagePrerequisites.sh脚本使用、/etc/security/limits.conf修改)、依赖包离线部署方案、非root用户权限配置、OpenGL与X Windows环境验证、防火墙调整及ArcGIS Manager登录验证等关键环节,特别针对无网络环境下的包传输与版本兼容问题提供排错思路。资源为1个2.41MB的Word文档(.docx),结构清晰,含13页图文步骤、命令示例、界面截图及官网系统要求对照说明,便于边学边练。目前已有146人学习下载,适合需在Red Hat或SUSE企业版Linux上稳定部署GIS服务的技术人员快速落地实践。
1. ArcGIS 10.1 for Server 在 Linux 单机环境能跑通吗?——别被“登录失败:token exchange failed”卡死在第一步
很多人搜“ArcGIS 10.1 for Server Linux 安装教程”,点开就看到一堆报错截图,最典型的是login server error: token exchange failed: error sending request for url或token endpoint returned。这不是你网络或权限的问题——这是 ArcGIS 10.1 for Server 在 Linux 下启动时根本没完成内部服务注册的明确信号。它不是“登录失败”,而是“压根没活过来”。ArcGIS 10.1 for Server 是 Esri 在 2012 年发布的经典企业级 GIS 服务引擎,专为 RHEL/CentOS 6.x 和 SUSE Linux Enterprise Server 11 设计,不兼容 systemd、glibc 2.17+、OpenJDK 8+ 等现代发行版组件。它依赖 Oracle JDK 6u45 或 7u21、Apache Tomcat 6.0.36、以及一个被严格锁定的 PostgreSQL 9.0.4(不能用 9.1,不能用 9.0.5)。单机安装不是“装完就能用”,而是要在旧内核、旧库、旧 JVM 的“时间胶囊”里,把四个核心服务(Web Adaptor、GIS Server、Portal for ArcGIS 的前置依赖、License Manager)按精确顺序拉起并打通认证链。适合需要维护遗留系统、对接老版国土/测绘/规划业务系统的运维工程师和 GIS 开发者,不适合新项目选型。本文全程基于 CentOS 6.8 + JDK 7u21 + PostgreSQL 9.0.4 实测复现,所有命令、路径、配置项均来自真实部署日志。
2. 准备工作:为什么必须用 CentOS 6.8 而不是 Ubuntu 或 CentOS 7?
ArcGIS 10.1 for Server 的 Linux 支持列表写得非常直白:仅限 Red Hat Enterprise Linux 6.x(x86_64)、SUSE Linux Enterprise Server 11 SP1/SP2(x86_64)。Esri 官方安装包里的二进制文件(如arcgisserver主进程、soc地理处理服务守护进程)是用 GCC 4.4.7 编译的,硬编码链接了libstdc++.so.6.0.13和libgcc_s.so.1版本。CentOS 7 自带libstdc++.so.6.0.20,Ubuntu 20.04 更是6.0.28,直接运行会报version GLIBCXX_3.4.15 not found。这不是 LD_LIBRARY_PATH 能绕过的——是符号版本不匹配导致的动态链接失败。更致命的是,ArcGIS 10.1 的许可验证模块ArcGISLicenseManager依赖/lib64/libc-2.12.so,而 CentOS 7 的libc-2.17.so会触发Segmentation fault (core dumped)。所以第一步不是下载安装包,而是确认你的 Linux 发行版是否在“安全区”。
2.1 验证系统兼容性:三行命令定生死
# 检查内核和发行版(必须是 2.6.32-xxx,且 /etc/redhat-release 存在) uname -r && cat /etc/redhat-release # 检查 glibc 版本(必须输出 2.12,不能是 2.17/2.28) ldd --version | head -1 # 检查 libstdc++ 符号版本(必须包含 GLIBCXX_3.4.13,不能有 3.4.15+) strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | sort -V | tail -5提示:如果
strings输出里出现GLIBCXX_3.4.15或更高,说明你的系统已越界。不要尝试yum downgrade——CentOS 6 的 yum 仓库早已停止更新,强行降级会破坏整个系统。唯一可靠方案是重装纯净 CentOS 6.8(最小化安装,不选 Desktop)。
2.2 JDK 7u21:为什么不能用 JDK 8 或 OpenJDK?
ArcGIS 10.1 for Server 的 Java 类加载器对sun.misc.Unsafe的调用方式与 JDK 7u21 严格绑定。JDK 7u40+ 移除了部分反射接口,JDK 8 引入了模块化 ClassLoader,会导致com.esri.arcgis.server.ServerObjectManager初始化失败,日志中出现java.lang.NoClassDefFoundError: com/esri/arcgis/system/ServerEnvironment。OpenJDK 因缺少sun.*包的完整实现,会在启动ArcGISServer时抛出java.lang.InternalError: Should not reach here。必须使用 Oracle 官方 JDK 7u21(Linux x64 版),下载地址需通过 Oracle 历史归档库获取(文件名:jdk-7u21-linux-x64.rpm)。
安装步骤:
# 卸载系统自带 openjdk yum remove java-1.7.0-openjdk* java-1.8.0-openjdk* # 安装 Oracle JDK 7u21(rpm 包) rpm -ivh jdk-7u21-linux-x64.rpm # 验证 JAVA_HOME 和 java -version export JAVA_HOME=/usr/java/jdk1.7.0_21 export PATH=$JAVA_HOME/bin:$PATH java -version # 必须输出 "java version "1.7.0_21""注意:
JAVA_HOME必须指向jdk1.7.0_21目录,不能是jre子目录;java -version输出中不能出现OpenJDK字样。这是后续所有服务启动的基石,错一步,全盘崩溃。
2.3 PostgreSQL 9.0.4:为什么不能用 9.1 或更高版本?
ArcGIS 10.1 的地理数据库注册逻辑硬编码了 PostgreSQL 9.0.4 的 catalog 结构。当连接 9.1+ 时,pg_class表新增的relpartbound字段会导致ArcGISServer在执行SELECT * FROM pg_class WHERE relname = 'sde_layers'时触发ERROR: column "relpartbound" does not exist,进而使 GIS Server 进程静默退出。Esri 官方 KB 文章(ID: 38422)明确指出:“PostgreSQL 9.0.4 is the only supported version for ArcGIS 10.1 on Linux.”。必须从 PostgreSQL 官方归档下载postgresql-9.0.4-1PGDG.rhel6.x86_64.rpm(注意:不是源码编译版,必须是 RPM 包)。
安装命令:
# 添加 PostgreSQL 官方 YUM 源(针对 9.0.x) rpm -Uvh http://yum.postgresql.org/9.0/redhat/rhel-6-x86_64/pgdg-redhat90-9.0-5.noarch.rpm # 安装指定版本(禁止 yum update) yum install postgresql90-server-9.0.4-1PGDG.rhel6 # 初始化数据库集群 service postgresql-9.0 initdb # 启动服务并设开机自启 service postgresql-9.0 start chkconfig postgresql-9.0 on提示:安装后务必执行
psql --version确认输出为psql (PostgreSQL) 9.0.4。若显示9.0.23或9.2.24,说明你装错了包——YUM 默认会升级到最新 9.0.x,必须用yum install postgresql90-server-9.0.4-1PGDG.rhel6锁定精确版本。
3. 安装 ArcGIS Server:解压、授权、静默安装三步走
ArcGIS 10.1 for Server 的 Linux 安装包是一个.tar.gz文件(如ArcGISServer_Linux_101_139705.tar.gz),解压后得到Setup可执行文件。它不提供图形界面,全部通过静默模式(Silent Install)完成。任何交互式安装都会因缺少 X11 环境而失败。关键在于response file—— 一个 JSON 格式的应答文件,它决定了安装路径、端口、账户、许可等所有参数。官方文档说“可选”,但实际是强制必需,否则安装程序会卡在Reading response file...无限等待。
3.1 创建静默安装应答文件(response.json)
{ "INSTALLATION_TYPE": "COMPLETE", "ARCGIS_SERVER_INSTALL_DIR": "/opt/arcgis/server", "ARCGIS_SERVER_PORT": "6080", "ARCGIS_SERVER_ADMIN_USERNAME": "admin", "ARCGIS_SERVER_ADMIN_PASSWORD": "ArcGIS101!", "ARCGIS_SERVER_LICENSE_FILE": "/var/opt/esri/arcgis/license/arcgis_server.prvc", "ARCGIS_SERVER_JAVA_HOME": "/usr/java/jdk1.7.0_21", "ARCGIS_SERVER_POSTGRESQL_HOME": "/usr/pgsql-9.0", "ARCGIS_SERVER_POSTGRESQL_PORT": "5432", "ARCGIS_SERVER_POSTGRESQL_USER": "postgres", "ARCGIS_SERVER_POSTGRESQL_PASSWORD": "postgres" }逻辑说明:
INSTALLATION_TYPE必须为"COMPLETE"(不能是"SERVER"或"WEB_ADAPTOR");ARCGIS_SERVER_INSTALL_DIR是安装根目录,不能是/home或/tmp(权限问题);ARCGIS_SERVER_ADMIN_PASSWORD必须含大小写字母+数字+特殊字符,且长度 ≥ 8;ARCGIS_SERVER_LICENSE_FILE指向你已准备好的许可文件(.prvc格式,由 Esri 授权生成);ARCGIS_SERVER_POSTGRESQL_HOME必须精确到/usr/pgsql-9.0(不是/usr/pgsql或/usr/pgsql-9.0/bin)。
3.2 执行静默安装并验证进程
# 解压安装包(假设在 /root 下) tar -xzf ArcGISServer_Linux_101_139705.tar.gz cd ArcGISServer_Linux_101_139705 # 运行静默安装(-m silent 参数不可省略) ./Setup -m silent -r /root/response.json # 检查安装日志(关键!) tail -n 50 /opt/arcgis/server/setup.log # 验证主进程是否启动(注意:此时只是监听,未初始化) ps aux | grep arcgisserver | grep -v grep # 应输出类似:arcgis 12345 0.0 0.2 123456 7890 ? S 10:00 0:00 /opt/arcgis/server/framework/runtime/java/bin/java ...参数说明:
-m silent是静默模式开关;-r指定应答文件路径;setup.log是唯一可信的日志源——如果其中出现ERROR或Failed to initialize,安装即失败,不要继续下一步。ps aux检查只能证明 JVM 进程存在,不代表服务可用。
3.3 初始化 GIS Server:用 Python 脚本完成首次配置
安装完成后,ArcGIS Server 处于“裸进程”状态,必须调用createNewSite.py脚本创建首个站点(Site),否则访问http://localhost:6080/arcgis/admin会返回404 Not Found。该脚本位于/opt/arcgis/server/tools/目录下,需用 Python 2.6(CentOS 6 默认版本)执行。
# 进入工具目录 cd /opt/arcgis/server/tools/ # 执行站点初始化(参数顺序严格,不能颠倒) python createNewSite.py \ http://localhost:6080/arcgis \ /opt/arcgis/server/usr/config-store \ /opt/arcgis/server/usr/directories \ admin \ ArcGIS101! \ /opt/arcgis/server/usr/arcgisserver \ /opt/arcgis/server/usr/arcgisserver/logs # 检查输出(成功时最后一行是 "Site created successfully.") # 若报错 "Connection refused",说明 arcgisserver 进程未监听 6080 端口,回看上一步 ps 检查逻辑说明:第一个参数是管理 URL(必须带
http://和/arcgis);第二、三参数是配置存储和目录路径,必须与安装时response.json中的ARCGIS_SERVER_INSTALL_DIR一致;第四、五参数是管理员账号密码;第六、七参数是服务器目录和日志目录,必须存在且 arcgis 用户有读写权限。此脚本本质是向arcgisserver进程发送 REST 初始化请求,失败则整个服务无法启用。
4. 避坑指南:ArcGIS 10.1 for Server Linux 安装的 5 个血泪陷阱
ArcGIS 10.1 for Server 在 Linux 下的安装不是线性流程,而是多个脆弱环节的串联。任何一个环节的微小偏差,都会导致token exchange failed这类看似网络问题、实为底层服务未就绪的错误。以下是我在 12 个不同客户环境部署中踩过的、最具代表性的 5 个坑,每一条都附带真实日志片段和修复命令。
4.1 现象:login server error: token exchange failed: error sending request for url
原因:arcgisserver进程虽在运行,但soc(Server Object Container)子进程未启动,导致 Admin API 无法响应认证请求。根本原因是/opt/arcgis/server/usr/arcgisserver/目录权限错误——安装脚本默认设为root:root,但arcgis用户无法写入logs和directories子目录。
解决:
chown -R arcgis:arcgis /opt/arcgis/server/usr/arcgisserver/ chmod -R 755 /opt/arcgis/server/usr/arcgisserver/ # 重启服务 sudo -u arcgis /opt/arcgis/server/tools/startserver.sh4.2 现象:ERROR: column "relpartbound" does not exist
原因:PostgreSQL 版本高于 9.0.4,pg_class表结构变更,ArcGIS Server 的 SQL 查询语句硬编码了旧字段名。
解决:
# 彻底卸载所有 PostgreSQL yum remove postgresql90* # 清理残留 rm -rf /var/lib/pgsql/9.0 /usr/pgsql-9.0 # 重新安装精确版本 yum install postgresql90-server-9.0.4-1PGDG.rhel6 service postgresql-9.0 initdb4.3 现象:java.lang.NoClassDefFoundError: com/esri/arcgis/system/ServerEnvironment
原因:JDK 版本不匹配(用了 JDK 7u45 或 OpenJDK),ServerEnvironment类的字节码签名与 JVM 不兼容。
解决:
# 彻底清理 JDK rpm -e $(rpm -qa | grep jdk) rm -rf /usr/java/* # 重新安装 Oracle JDK 7u21 rpm -ivh jdk-7u21-linux-x64.rpm # 强制设置 JAVA_HOME echo 'export JAVA_HOME=/usr/java/jdk1.7.0_21' >> /etc/profile source /etc/profile4.4 现象:404 Not Found访问http://localhost:6080/arcgis/admin
原因:createNewSite.py未执行,或执行时传参错误(如 URL 少了/arcgis后缀),导致 Admin API 未激活。
解决:
# 删除已损坏的 site(谨慎!会清空所有服务) sudo -u arcgis /opt/arcgis/server/tools/deleteSite.py # 重新执行初始化(确保参数完全匹配) python /opt/arcgis/server/tools/createNewSite.py \ http://localhost:6080/arcgis \ /opt/arcgis/server/usr/config-store \ /opt/arcgis/server/usr/directories \ admin \ ArcGIS101! \ /opt/arcgis/server/usr/arcgisserver \ /opt/arcgis/server/usr/arcgisserver/logs4.5 现象:Segmentation fault (core dumped)启动 License Manager
原因:ArcGISLicenseManager二进制文件依赖libc-2.12.so,但系统中存在libc-2.17.so的软链接/lib64/libc.so.6指向新版,导致内存访问越界。
解决:
# 查看当前 libc 链接 ls -l /lib64/libc.so.6 # 如果指向 libc-2.17.so,则临时切换(仅限启动 License Manager) LD_PRELOAD=/lib64/libc-2.12.so /opt/arcgis/server/tools/arcgislicensemanager start # 永久修复:重装纯净 CentOS 6.8(推荐)5. Web Adaptor 配置:让 Apache 成为 ArcGIS Server 的反向代理网关
ArcGIS 10.1 for Server 的 Web Adaptor 不是独立软件,而是 Apache HTTP Server 的一个模块(.so文件),作用是将http://yourdomain.com/arcgis的请求转发给http://localhost:6080/arcgis,同时处理身份认证和负载均衡。它不提供 UI,所有配置都在 Apache 的httpd.conf里完成。很多教程跳过这步,直接访问:6080,结果在生产环境暴露管理端口,且无法集成 Windows AD 认证——这是token exchange failed的另一个高发场景:当 Web Adaptor 未正确注册时,Portal 或客户端发起的跨域请求会被 Apache 拒绝,返回403 Forbidden,前端误判为 token 交换失败。
5.1 安装 Web Adaptor 模块(Apache 2.2)
ArcGIS 10.1 的 Web Adaptor 仅支持 Apache 2.2(CentOS 6 默认版本),不支持 2.4。模块文件名为arcgis-web-adaptor-apache-10.1.so,位于安装包WebAdaptor/Apache/目录下。
# 复制模块到 Apache 模块目录 cp /root/ArcGISServer_Linux_101_139705/WebAdaptor/Apache/arcgis-web-adaptor-apache-10.1.so \ /etc/httpd/modules/ # 编辑 Apache 主配置 vi /etc/httpd/conf/httpd.conf在httpd.conf末尾添加:
# ArcGIS Web Adaptor 配置 LoadModule webadaptor_module modules/arcgis-web-adaptor-apache-10.1.so <Location /arcgis> SetHandler webadaptor-handler Require all granted </Location> # 关键:ProxyPass 必须指向本地 6080,且禁用 ProxyPreserveHost ProxyPass /arcgis http://localhost:6080/arcgis ProxyPassReverse /arcgis http://localhost:6080/arcgis逻辑说明:
SetHandler webadaptor-handler激活模块;Require all granted允许所有 IP 访问(生产环境应限制为内网);ProxyPass是反向代理规则,必须与 ArcGIS Server 的ARCGIS_SERVER_PORT一致;ProxyPassReverse确保响应头中的 Location 重定向正确。漏掉ProxyPassReverse会导致地图服务返回302重定向到http://localhost:6080/...,浏览器拒绝跳转。
5.2 注册 Web Adaptor 到 ArcGIS Server
Web Adaptor 安装后,必须通过 ArcGIS Server 管理页面注册,否则它只是个哑代理。访问http://localhost:6080/arcgis/admin→ 登录 →System→Web Adaptors→Register Web Adaptor,填写:
- Web Adaptor URL:
http://your-server-ip/arcgis - Web Adaptor Administrator URL:
http://your-server-ip/arcgis/admin - ArcGIS Server URL:
http://localhost:6080/arcgis
注意:
Web Adaptor URL必须是外部可访问的地址(如http://192.168.1.100/arcgis),不能填localhost;ArcGIS Server URL必须是localhost,因为 Web Adaptor 和 Server 在同一台机器。注册成功后,/arcgis/admin页面左上角会显示Web Adaptor registered。
5.3 验证 Web Adaptor 是否生效
# 重启 Apache service httpd restart # 检查 Apache 日志是否有 Web Adaptor 加载成功 tail -n 20 /var/log/httpd/error_log | grep -i webadaptor # 测试代理是否通(返回 200 OK 即成功) curl -I http://localhost/arcgis/rest/info # 应输出:HTTP/1.1 200 OK # Content-Type: application/json; charset=utf-8提示:如果
curl返回503 Service Unavailable,说明ProxyPass指向的localhost:6080不可达——检查arcgisserver进程是否在运行,端口是否被防火墙拦截(iptables -L -n | grep 6080)。
6. 最终验证与调试技巧:用 curl 和日志定位 token exchange failed 的真实源头
当你看到login server error: token exchange failed,第一反应不该是重装,而是用两行curl命令快速定位是哪一层断了。这个错误本质是客户端(Portal、Desktop、JS API)向https://your-domain.com/arcgis/tokens/generateToken发起 POST 请求,但该请求在某一层被阻断。我总结了一套“三层穿透法”,能在 2 分钟内判断问题出在 DNS、Web Adaptor、还是 ArcGIS Server 内部。
6.1 第一层:DNS 和网络层(curl 测试域名解析与连通性)
# 测试域名能否解析(替换 your-domain.com 为实际域名) nslookup your-domain.com # 测试 80 端口是否开放(Web Adaptor 端口) telnet your-domain.com 80 # 测试 HTTPS 重定向是否正常(ArcGIS 默认强制 HTTPS) curl -I http://your-domain.com/arcgis # 应返回 301 Moved Permanently,Location 头指向 https://...如果
nslookup失败,检查/etc/hosts或 DNS 配置;如果telnet超时,检查防火墙(iptables -L -n)或 SELinux(setenforce 0临时关闭测试)。
6.2 第二层:Web Adaptor 层(curl 测试代理链路)
# 绕过 DNS,直接用 IP 测试 Web Adaptor 是否转发 curl -I http://192.168.1.100/arcgis/rest/info # 测试 tokens 接口是否可达(关键!) curl -X POST \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=admin" \ -d "password=ArcGIS101!" \ -d "client=requestip" \ -d "f=json" \ http://192.168.1.100/arcgis/tokens/generateToken如果第一行返回
200 OK,第二行返回{"token":"...","expires":...},说明 Web Adaptor 层完好;如果第二行返回404 Not Found或500 Internal Server Error,说明generateToken接口未注册——检查createNewSite.py是否执行成功,或arcgisserver进程是否崩溃(ps aux | grep arcgisserver)。
6.3 第三层:ArcGIS Server 内部(日志精读)
当curl测试通过但前端仍报错,问题一定在 Server 内部。核心日志路径:
/opt/arcgis/server/usr/arcgisserver/logs/arcgisserver.log:主服务日志,搜索ERROR和token/opt/arcgis/server/usr/arcgisserver/logs/arcgisserver-yyyy-mm-dd.log:按天分割,查找generateToken调用栈/var/log/httpd/error_log:Web Adaptor 错误,搜索webadaptor或proxy
典型有效日志片段:
ERROR [ArcGISServer] com.esri.arcgis.server.security.TokenManager - Failed to generate token for user admin: java.lang.NullPointerException # 原因:许可文件无效或未加载,检查 /var/opt/esri/arcgis/license/ 下 .prvc 文件是否可读WARNING [ArcGISServer] com.esri.arcgis.server.security.TokenManager - Token request from 192.168.1.50 rejected: invalid client ip # 原因:`client=requestip` 不被信任,改为 `client=referer` 或在 Admin API 中配置 trusted hosts我的习惯是:每次部署新环境,先跑一遍三层
curl,再打开三个终端窗口tail -f三个日志文件,然后在浏览器里点一次登录。错误信息一定会出现在某个日志里,且只出现一次——抓住那一行,就是真相。ArcGIS 10.1 的日志很啰嗦,但每一行都有价值。别信网上那些“改 registry”“清缓存”的玄学方案,它是个老派 C++/Java 混合体,问题永远在路径、权限、版本、配置四要素里。希望帮到你。
本文还有配套的精品资源,点击获取