"本贴主要介绍了 [链接] 的关键配置及其设计用意,所以无论你是 Latke 的开发者还是基于 Latke 开发的产品的使用者,希望本贴能够帮助到你。 为了说明方便,我们会使用 [链接] 博客系统作为主要的应用场景进行举例。 latke.properties 文件路径是 WEB-INF/classes/latke.pro .."

Latke 配置剖析

本贴主要介绍了 Latke 的关键配置及其设计用意,所以无论你是 Latke 的开发者还是基于 Latke 开发的产品的使用者,希望本贴能够帮助到你。

为了说明方便,我们会使用 Solo 博客系统作为主要的应用场景进行举例。

latke.properties

文件路径是 WEB-INF/classes/latke.properties,该配置文件是必须的。通常情况其中的配置项比较少,最简化的情况是只需要配置 #### Server #### 部分的 serverScheme,其他项都有默认值,不需要显示设置。

Server 部分

一些 Solo 用户在初始化时会遇到“配置错误”的问题,这是因为 latke.props 没有配置或配置不当造成的。该配置文件中 #### Server #### 部分的配置如下:

#### Server ####
# Browser visit protocol
serverScheme=http
# Browser visit domain name
serverHost=localhost
# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!
serverPort=8080

这 3 个配置项需要配置为用户通过浏览器访问时候的值。换句话说,如果你的服务在本机启动,那么默认的配置是可以让你在本机通过 http://localhost:8080 访问时一切正常的;但非本机访问时(比如通过 http://domain-or-ip:8080) 就不能正常加载静态资源了。

解决方案:将这三个配置项的值调整为最终访问时候对应的样子。

比如我的博客域名是 myblog.com,该域名已经正常解析到服务器 IP,此时只需要将 serverHost 的值设置为 myblog.com 就可以通过 http://myblog.com:8080 访问了。要进一步消除后面的端口有两种方式:

  1. 前置 HTTP 服务器做反向代理(比如通过 [NGINX] )
  2. 将 Solo 启动时监听端口调整为 80/443,或者留空

推荐第一种方式,因为:Servlet 容器主要是 Java Web 应用的处理环境,主要处理的是动态请求。HTTPS 或者是静态资源请求应该交由更专业的 HTTP 处理引擎来做,这样能减少很多复杂的配置(比如配置 Java 的 SSL 证书),也能充分优化性能(比如静态资源由 NGINX 处理,配置 Cache、限流等)。

一个正确的配置样例如下:

#### Server ####
# Browser visit protocol
serverScheme=http
# Browser visit domain name
serverHost=myblog.com
# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!
serverPort=

请注意其中 serverPort 项并没有赋值,因为这样就能够使用 HTTP 的浏览器默认端口 80 了,HTTPS 也可以这样留空。

Static Server 部分

该部分通常情况是没有显示配置的(比如 Solo 里面默认的配置文件就没有出现这部分),需要显示配置的情况是需要做动静分离的应用场景。

前面我们提到过可以通过 NGINX 作为前置服务器,将静态资源请求分离出来进行处理。其具体的分离规则可以按 path 或后缀。这个动静分离的层次是在具体服务器节点上的分离,是用户请求到达内部网络后的处理。

我们可以在用户浏览器请求时就进行动静分离,将静态资源请求分发到配置好的 CDN 服务上,这个 CDN 服务一般是一个域名地址。而 staticServerSchemestaticServerHoststaticServerPort这三项就是用来配置该地址的,如果没有显示配置,则这三项会分别使用 serverSchemeserverHostserverPort 的值。

其他配置项

下面这些配置项也是在某些场景才会用到,一般来说也不用单独配置的。

说明 默认值 备注
runtimeMode 运行模式,可选值 DEVELOPMENTPRODUCTION PRODUCTION 线上环境一定要使用 PRODUCTION
staticResourceVersion 静态资源版本号,主要用于刷缓存 默认取服务启动的时间毫秒
contextPath 容器上下文路径 自动获取部署上下文路径 会和虚拟目录的配置相关
staticPath 静态资源服务的上下文路径 contextPath 显示配置的话一般都是留空

其中“上下文路径”是 Java Servlet 中的概念,指的是请求 URL 上第一层目录路径,比如对于 http://mydomain.com/solo/login,/solo 就是上下文路径,但该值也和部署目录相关,本例需要应用部署在 tomcat/webapps/solo 目录中,如果应用部署在 ROOT 目录下,那上下文路径就是空字符串。

顺便吐槽一下,“上下文路径”这个概念是 Java Servlet 规范里面特有的,是一个很奇葩的设计,标准的 HTTP 协议是没有这个设定的,并且 Servlet API 中定义的 Request URI 和 URI RFC 定义的完全不是一个东西,关于 URI 和 URL 的正解请看这里

配置后如果还遇到问题,请打开浏览器 F12 查看网络请求进行调试。

local.properties

文件路径是 WEB-INF/classes/local.properties,该文件是必须的,主要用于配置数据库。比如在 Solo 中默认的配置如下:

#### H2 runtime ####
runtimeDatabase=H2
jdbc.username=root
jdbc.password=
jdbc.driver=org.h2.Driver
jdbc.URL=jdbc:h2:~/solo_h2/db

#### MySQL runtime ####
#runtimeDatabase=MYSQL
#jdbc.username=root
#jdbc.password=
#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.URL=jdbc:mysql://localhost:3306/solo?useUnicode=yes&characterEncoding=utf8

# The minConnCnt MUST larger or equal to 3
jdbc.minConnCnt=5
jdbc.maxConnCnt=10

# The specific table name prefix
jdbc.tablePrefix=b3_solo

其中 #### H2 runtime ######## MySQL runtime #### 只能启用一种,该部分配置了使用哪一种数据库实现。

其他的配置项比较好识别,一般来说使用默认值就好。

H2

默认使用应用内嵌的 H2 数据库,其中 jdbc.URL 中可以配置数据持久化的文件路径,比如 jdbc:h2:~/solo_h2/db 使用的路径就是 操作系统用户 home (即 ~ )下的 solo_h2/db 目录,在 Java 中对于的系统变量是 ${user.home},如果你不大熟悉 Unix-like 的表示法,也可以将该路径配置成完整的绝对路径,比如 jdbc:h2:D:/solo_h2/db

static-resources.xml

文件路径是 WEB-INF/static-resources.xml,该配置文件是必须的,用于配置静态资源路径。

每款 Servlet 容器都有一个“默认的 Servlet”来处理请求,并包括了对静态资源 IO 的优化实现,所以我们需要根据请求路径将静态资源请求分发到该 Servlet 上。

路径的匹配模式是 Ant-style 匹配,简单说来就是:

如果你需要添加自己的静态资源(比如 HTML、MP3 等)就需要修改一下该文件。

Latke 对于“默认的 Servlet”支持如下:

环境变量

测试环境、生产环境如果需要加载不同的配置文件,可通过设置操作系统环境变量来指定配置文件的绝对路径。

优先通过环境变量加载,如果没有定义该环境变量则从类路径下加载。

  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    49 引用 • 360 回帖 • 510 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2164 引用 • 7414 回帖 • 1022 关注
  • Web
    102 引用 • 352 回帖 • 7 关注
  • 框架
    27 引用 • 249 回帖
感谢    关注    收藏    赞同    反对    举报    分享
优质回帖
  • devotion   1 感谢  

    喜欢这种自己封装的框架,而不是动则就是 spring、mybatis 的,可以更深入理解底层框架原理,而又不致于过于臃肿,赞!

  • lkk  

    已经按照如上修改了,还是显示错误http://ddres.xin/solo

70 回帖    
请输入回帖内容...
  • Eddie   1 感谢    

    我就不喜欢用框架,轻量封装的还好。

    感谢    赞同    反对    举报    分享       评论    回复
  • zonghua      

    一直不明白那个路径到底要不要 / 结尾

    2 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    host 不用 / 结尾,contextPath 如果要配置也不用 / 结尾。

    感谢    赞同    反对    举报    分享       评论    回复
  • devotion   1 感谢      

    喜欢这种自己封装的框架,而不是动则就是 spring、mybatis 的,可以更深入理解底层框架原理,而又不致于过于臃肿,赞!

    感谢    赞同 1    反对    举报    分享       评论    回复
  • lijp      

    当使用 Https 部署 Sym 的时候,此配置文件(latke.properties)中 serverPort=, 保留空,即使是 80,也要保留空,否则 wss 报错。

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    HTTPS 的话留空或者填 443 就好啦

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • lijp            

    我错了,忘记 https 的端口是 443 了。。。我上一条评论能删除吗?

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    现在删不了,以后会可以更新

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • lijp            

    这几天脑袋短路了。。。我还郁闷了还几天 😢

    感谢    赞同    反对    举报    分享       评论    回复
  • cc8848      

    mail.properties 这个文件在代码里面没有发现,是需要自己写个配置上去吗,ed5076da933b4db4be3680ebd0ccddee.png

    配置自己的邮箱该怎么写

    2 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    sym 的邮件配置在 symphony.props 里

    感谢    赞同    反对    举报    分享       评论    回复
  • feix   1 感谢      

    找到回复了。。。这么大个按钮,为什么放在右下角?

    ** 为我的愚笨默哀三分钟 **

    latke 配置写的挺好,但是对于想要躲开或单机部署多份的来看,加上参数 -lp 很有必要 还有很多参数 。有需要的童鞋看下源码比较好。

    • btw
      • 代码
        • 真的
            • 清爽

    • 希望可以在过程中产生有价值的 PR,给社区和大家贡献一份绵薄之力

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    谢谢 :)

    PS 键盘快捷键

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • feix            

    👍 ** 老大。。。你是 AI 还是真人 **

    这么晚了,没休息么

    P.S. 水杯在右面。。。那个视角刚刚好, 看不到。 😅

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    我是真の人工智能。正准备睡觉,晚安了 😴

    2 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • feix            

    晚安。 😴

    第一次勇于尝试 MD。。。感觉还不错。

    感谢    赞同    反对    举报    分享       评论    回复
  • xiesguo            

    数据库里的表怎么实现建立的

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    这里看起

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • xiesguo            

    没有这方面的说明文档吗? 就像你讲的 Latke 下的 servlet 原理和 ioc 的原理. 这种详细一点

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    那两篇文档是其他牛人写的。

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • xiesguo            

    哦, 那有没有, 数据库表结构的说明文档呢. 我找了好久, 都没找到. 源码有些看不懂 😂

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    你在看哪个项目?

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • xiesguo            

    对的, 我们对你们这个项目重构, 上线之后. 就会向你们购买

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    你说的是 Sym 这个项目么?

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • xiesguo            

    对啊, 有没有更详细的资料啊

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    加我 QQ 聊吧 845765

    感谢    赞同    反对    举报    分享       评论    回复
  • hoper            

    测试

    感谢    赞同    反对    举报    分享       评论    回复
  • hoper            

    test

    感谢    赞同    反对    举报    分享       评论    回复
  • lkk      

    已经按照如上修改了,还是显示错误http://ddres.xin/solo

    感谢    赞同 1    反对    举报    分享       评论    回复
  • hiquanta      

    nginx 反向代理公用 多个网站同一个服务器 公用一个端口 ,配置后 hiquanta.com 可以正常打开,但是不能登陆,但是用 http://hiquanta.com:8081/solo 可以正常打开登陆界面,而且可以登陆,老大可以点下看看什么情况?

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    请仔细看本文。

    感谢    赞同    反对    举报    分享       评论    回复
  • Chigogo      

    显式配置域名和端口会带来一些问题:

    如果我的博客有两个域名, 两个域名指向服务器地址,该如何配置? serverHost=your.domain1 serverHost=your.domain2

    如果设置了反向代理, 如何通过 ip 访问? serverHost=1.2.3.4:8080

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    两个域名的话在反代那里重定向,不建议使用两个域名或者 IP,影响 SEO

    感谢    赞同    反对    举报    分享       评论    回复
  • Chigogo      

    frp 内网穿透: 主机 A 无法使用 80 端口,服务器 B 可以使用 80 端口,这时候,使用 A 使用 frp 连接到服务器 B;

    过程如下: 浏览器访问域名   --> 域名解析到 B 的 80 端口     -->B 反代到 A 的 8080 端口

    此时此刻,我无法直接用 A 的 ip 访问博客后台了。

    为什么要这么做呢?就是想这么做啦……

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    总之你配置成最终访问的域名就行了。

    感谢    赞同    反对    举报    分享       评论    回复
  • Chigogo      

    我就是想说,显示设定端口和域名不太好啦。。当然作者有自己的想法

    感谢    赞同    反对    举报    分享       评论    回复
  • chenlei65368      

    挺好,配置比较细

    感谢    赞同    反对    举报    分享       评论    回复
  • Joan      

    你好,请问报这个错误的原因是什么啊

    [ERROR]-[2018-04-19 10:38:50]-[org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer:116]: Not found template[author-articles.ftl]

    author-articles.ftl 这个文件是存在的

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    怎么重现这个问题?

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • Joan            

    在本地开发环境中配置服务器上的 ip 等信息时,maven install 抛出来的错误

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    这个是个运行时错误吧,是 solo 项目的话到这里反馈 https://github.com/b3log/solo/issues/new

    感谢    赞同    反对    举报    分享       评论    回复
  • joypigg   1 感谢      

    数据库 Client 端,需设置字符编码,utf8 格式,否则会出现起始页码 b3_solo_option 中 optionValue 插入 SQL 异常;
    mysql 查看字符集:show variables like ‘char%’;
    安装所需的 database 字符集进行设置为 utf8:ALTER DATABASE 你的 database DEFAULT CHARACTER SET utf8;

    感谢    赞同    反对    举报    分享       评论    回复
  • mogiihu      

    latke.properties 里 找不到 #### Server 部分 怎么回事

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            
    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • mogiihu            

    我下载的源码,如果从 solo/src/main/resources/latke.properties 这个文件里修改然后打包。是不是就不需要修改生成的 target/classes/latke.properties

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250            

    你看下最终部署的包是不是改过不就知道了嘛。

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • mogiihu            

    好的,谢谢 ~ 对我帮助很大

    感谢    赞同    反对    举报    分享       评论    回复
  • wanwaner      

    我根据上面改了 server 部分,但是还是显示 latke 配置错误,我该怎么做,需要检查哪些地方

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • 88250   1 感谢            

    F12 看下网络请求

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
  • wanwaner            

    已解决,谢谢

    1 回复 
    感谢    赞同    反对    举报    分享       评论    回复
请输入回帖内容...