惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
博客园_首页
量子位
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
T
The Blog of Author Tim Ferriss
博客园 - 聂微东
V
Visual Studio Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
D
Docker
大猫的无限游戏
大猫的无限游戏
Y
Y Combinator Blog
H
Help Net Security
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野
将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令...
adlered · 2019-12-09 · via 技术改变视野

前言

近日打算对服务端进行进一步的解耦,便购入了云数据库服务,将数据库独立,使得Tomcat主机独立运行,提高安全性和便利性。
心血来潮,想将服务器重装为Windows,便有了下面的一系列文章:

迁移MySQL

平时我都是使用Navicat对MySQL进行管理。在备份的第一时间我便想到了使用Navicat进行数据的迁移。

Dump SQL File

右键指定的数据库,选择Dump SQL File -> Structure + Data就可以将选定数据库全部的结构、参数、表、键值保存到一个文件中,我将其输出到桌面以便恢复。

Execute SQL File

登录到新的数据库中,并建立一个名称相同的数据库。右键该数据库,选中Execute SQL File

为什么要迁移

比对Windows和Linux的区别,对我而言:

Linux(Ubuntu 16.04)

优点

  1. 占用内存小
  2. Terminal用起来太爽
  3. 开源
  4. 安装工具方便(apt)
  5. ......

不足

  1. 不知道,别问我

Windows (Windows Server 2016)

优点

  1. 桌面环境比较成熟
  2. 文件权限划分清晰严谨
  3. 图形界面进行编辑(学不会Vim)、服务安装配置比较快捷
  4. 能挂QQ成长值(?!)

不足

  1. 内存占用太高,开机就2G
  2. ......

迁移前我做的规划

  1. 将Tomcat服务端打包,备份到本地
  2. 安装Java并配置环境变量
  3. 用IIS配置FTP服务
  4. 将Tomcat服务端上传,并运行测试
  5. 配置防火墙,禁止一大堆自带的服务监听端口

我遇到的问题

1. 控制台中文乱码

遇到这个问题的时候,我还是不慌的,在我的意料之内。
在查找资料后,我找到了解决办法:
conf/logging.properties文件中,添加下面一行(先检查是否已经存在,如果已经存在直接修改即可):

1java.util.logging.ConsoleHandler.encoding = GBK
2

这是因为Windows的控制台编码为GBK,而Linux的终端编码一般为UTF-8而导致的。

2. ​​​HTML中文乱码

这可真是令人手忙脚乱了... JSP和Servlet都是正常的,但HTML的中文却是乱码。排除法:
√ HTML头部设置了<meta charset="utf-8"/>
√ HTML源文件编码经检测为UTF-8
√ web.xml拦截器编码设置为UTF-8
? 问题可能出在Tomcat的配置

—— 再次经过几经查找,我找到了两种解决方法:

方法一:server.xml

编辑conf/server.xml文件,在Connector后边追加参数URIEncoding="UTF-8"

由于我开启了SSL,所以在port443的后方加入。如果你没有使用HTTPS而只是使用了HTTP,那么找到port80的后方加入即可。

方法二:catalina.sh

编辑bin/catalina.sh文件:

找到JAVA_OPTS并追加参数:

1-Dfile.encoding=utf-8

通过这条参数,我们可以从根源(JVM)处告诉Tomcat,要以UTF-8的编码来读取文件。

最后,通过方法二(推荐都使用)解决了HTML中文乱码的问题。

3. APR模式不可用

经常使用Tomcat的小伙伴可能知道APR模式。

Tomcat的三种模式

模式 描述 性能
BIO Blocking I/O 阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作。
NIO Non-Blocking I/O 基于缓冲区,并能提供非阻塞I/O操作的Java API。
APR Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。

在Linux,我一直使用APR模式来运行Tomcat服务端,但这次有些不对劲儿。

JAVA_OPTS可能与APR模式冲突

由于APR模式需要安装额外的扩展,我便安装并进行了测试,但并没有效果。
在这之后,我尝试了:

  1. 使用安装版Tomcat并勾选APR扩展
  2. 重新生成配置文件
  3. 重新生成并导入域名SSL证书
  4. 查找可能导致冲突的配置

最终的一个现象:
一旦我开启APR模式,HTTPS就无法访问。
在一个下午的苦苦挣扎后,我找到了问题所在:

一旦为JAVA_OPTS添加参数-Dfile.encoding=utf-8,APR模式就无法正常工作。

为什么不直接将所有文件转码为GBK?

其实我本可以直接将所有的页面文件转码为GBK(Windows的默认编码)从而直接防止上述所有情况的发生,但过程复杂,且一旦需要迁移回Linux非常繁琐
所以最后,我放弃了APR,使用无需额外扩展及配置的NIO模式:
编辑conf/server.xml

修改protocol的参数为 ``` org.apache.coyote.http11.Http11NioProtocol

1<h1>后语</h1>
2总的来说,除了在文件编码方面略有困难之外,在<strong>提前做好充足功课</strong>之后还是能够迁移成功的。<br />
3生命在于折腾。<br />
4(如果事事都能像自己预想的那样运行,谁还愿意瞎折腾呢?)