部署xwiki,终于装上了。

因为想给单位同事们建一个知识库系统,经过多轮比选确定使用xwiki系统,功能强大,扩展性强,采用java编写,单位科技部门的同事们熟悉。上线之前我自己打算先试装一下,于是就开始各种踩坑。

坑一:一开始想安装最新的stable版14.9,无奈装了很多次都装不上,各种报错,各种调试,都不管用。后来分析原因主要可能是jdk版本不对,14.9要求jdk11以上,由于我是用宝塔系统安装的,宝塔在装tomcat时默认安装的是java1.8,而且我也不知道怎么修改配置让xwiki采用jdk11的包,后来也安装了jdk11,也安装了jdk17,java -version 都显示正确的版本号,但就是安装不成功,各种报错。后来想到可能是xwiki版本问题,果断放弃14.9,投入13.10.10(lts版)怀抱。这是第一个大坑,折腾我2天。
坑二:用宝塔建的数据库,无法连接xwiki,也就无法安装xwiki. 我就是按照这位大佬的安装方法:xwiki部署,没安装成功,走了不少弯路。

最后发现唯一正确的做法是:按照官方的安装步骤来,这好像是正确的废话,可是就是真理。

官方地址如下:官方安装指南

按照下面这4步逐一完成:

  1. 安装和配置servlet容器;
  2. 设置永久路径;
  3. 安装和配置关系型数据库;
  4. 安装xwiki的UI界面。
0x00:安装tomcat

容器我选的是tomcat,下面是安装步骤:

  1. 确保给tomcat分配了足够多的内存,这一点在虚拟机上安装的小伙伴要特别注意;
  2. 把下载的xwiki13.10.10的包放在tomcat的webapps目录下面,这里有个小技巧,在宝塔下面刷新一下目录,xwiki包就自动解压了,生成一个跟你的war包同名的目录,我这里改成了xwiki。
  3. 打开TOMCAT_HOME/webapps/xwiki/WEB-INF/xwiki.properties 这个文件,设置永久目录,如下图:

这是我的目录,打开xwiki.properties文件,在91行左右找到永久目录的设定,修改成你设好的目录。建议不要放在/分区,因为这里主要存放数据文件,需要的空间比较大,我是放在了home分区。

4.启动tomcat.
进行tomcat安装目录下的bin目录,执行./shutdown.sh是关闭,./startup.sh是启动。

5.在你的浏览器中输入: http://localhost:8080/xwiki/bin/view/Main/,应该可以看到下面的图片,证明tomcat启动成功。

6.增加缓存。查一下你的日志文件,如下,如果有缓存溢出的报错,在 $CATALINA_BASE/conf/context.xml文件中的</context>之前加入以下配置。

<Resources cachingAllowed="true" cacheMaxSize="100000" ></Resources>

7.激活headless模式

如果你的操作系统没有X11库的话,比如我,用的是centos7.9,就必须激活tomcat 的headless模式,方法是:
/TOMCAT_HOME/bin/目录下新建setenv.sh文件,并写入如下代码:

#!/bin/sh
export JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true"

8.可选配置(我配了)

编辑conf/server.xml文件, 大约在70行左右,加入如下配置启用gzip压缩:

<Connector port="8080" 
... compression="on" 
    compressionMinSize="2048" 
    compressibleMimeType="text/html,text/xml,text/css,text/javascript,application/x-javascript">
</Connector>

我用的是8989端口,小伙伴们可以自行修改。

9.策略配置

对于激活安全管理器(security manager )的tomcat,默认是激活的,在conf/catalina.policy文件中加入以下配置策略:

grant codeBase "file:${catalina.base}/webapps/xwiki/WEB-INF/lib/-" {
  // for mySQL connection
  permission java.net.SocketPermission "127.0.0.1:3306", "connect,resolve";

  // XWiki must have access to all properties in read/write
  permission java.util.PropertyPermission "*", "read, write";

  // Generic detected permissions
  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
  permission java.lang.RuntimePermission "createClassLoader";
  permission java.lang.RuntimePermission "setContextClassLoader";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.loader";
  permission java.lang.RuntimePermission "accessDeclaredMembers";
  permission java.lang.RuntimePermission "getenv.ProgramFiles";
  permission java.lang.RuntimePermission "getenv.APPDATA";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect";
  permission java.lang.RuntimePermission "getClassLoader";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.connector";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.util.threads";
  permission java.lang.RuntimePermission "reflectionFactoryAccess";
  permission java.lang.RuntimePermission "accessClassInPackage.com.sun.jmx.interceptor";
  permission java.lang.RuntimePermission "accessClassInPackage.com.sun.jmx.mbeanserver";
  permission java.lang.RuntimePermission "modifyThread";
  permission java.lang.RuntimePermission "getProtectionDomain";

  // JAXB permissions
  permission javax.xml.bind.JAXBPermission "setDatatypeConverter";

  // Serialization related permissions
  permission java.io.SerializablePermission "allowSerializationReflection";
  permission java.io.SerializablePermission "creator";
  permission java.io.SerializablePermission "enableSubclassImplementation";

  // Internal resources access permissions
  permission java.io.FilePermission "synonyms.txt", "read";
  permission java.io.FilePermission "lang/synonyms_en.txt", "read";
  permission java.io.FilePermission "quartz.properties", "read";
  permission java.io.FilePermission "/templates/-", "read";
  permission java.io.FilePermission "/skins/-", "read";
  permission java.io.FilePermission "/resources/-", "read";

  // MBean related permissions
  permission javax.management.MBeanServerPermission "createMBeanServer";
  permission javax.management.MBeanPermission "*", "registerMBean";
  permission javax.management.MBeanPermission "*", "unregisterMBean";
  permission javax.management.MBeanTrustPermission "register";
  permission javax.management.MBeanPermission "-#-[-]", "queryNames";
  permission javax.management.MBeanServerPermission "findMBeanServer";

  // LibreOffice/OpenOffice related permissions
  permission java.io.FilePermission "/opt/openoffice.org3/program/soffice.bin", "read";
  permission java.io.FilePermission "/opt/libreoffice/program/soffice.bin", "read";
  permission java.io.FilePermission "/usr/lib/openoffice/program/soffice.bin", "read";
  permission java.io.FilePermission "/usr/lib/libreoffice/program/soffice.bin", "read";

  // Allow file storage directory reading - for directory and everything underneath
  // This is dependent on the setting of environment.permanentDirectory in xwiki.properties
  permission java.io.FilePermission "${catalina.base}${file.separator}xwikidata${file.separator}", "read,write,delete";
  permission java.io.FilePermission "${catalina.base}${file.separator}xwikidata${file.separator}-", "read,write,delete";

  // Allow file storage directory reading - temporary directory and everything underneath
  // This is dependent on the setting of environment.temporaryDirectory in xwiki.properties.
  permission java.io.FilePermission "${catalina.base}${file.separator}temp${file.separator}", "read,write,delete";
  permission java.io.FilePermission "${catalina.base}${file.separator}temp${file.separator}-", "read,write,delete";
};

别问我这是什么,我也看不懂!

10.使用反代理。如果小伙伴们也想像我一样主机放在家里,装上xwiki,又想在外网访问,怎么办呢?

它来了:配置nginx的反代理

由我的宝塔之前已经装好nginx1.22了,下面就是在nginx的配置目录下增加一个配置文件,宝塔的nginx配置策略里有这么一句话,include /www/server/panel/vhost/nginx/*.conf;,于是,我就在这个目录下建了一个配置文件tomcat.conf,配置策略如下:

server {
    listen       80;
    server_name  mydomain.com;

    # Normally root should not be accessed, however, root should not serve files that might compromise the security of your server. 
    root /var/www/html;

    # Configuration to avoid Request Entity too large error 413
    client_max_body_size 0;
  
    location / {
        # All "root" requests will have /xwiki appended AND redirected to mydomain.com
        rewrite ^ $scheme://$server_name/xwiki$request_uri? permanent;
    }

    location ^~ /xwiki {
       # If path starts with /xwiki - then redirect to backend: XWiki application in Tomcat
       # Read more about proxy_pass: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
       proxy_pass http://localhost:8080;
       proxy_set_header        X-Real-IP $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header        Host $http_host;
       proxy_set_header        X-Forwarded-Proto $scheme;
    }
}

在这里改成你想用的端口和域名就可以了,一般80是封了的,换成可用的,再用路由器转发一下,在外网就可以用mydomain.com访问你的xwiki了。

    server_name  mydomain.com;
至此,tomcat的配置告一段落。

0x01:配置关系型数据库

xwiki支持的数据库类型有很多,官方有列表,这里我选择了最大众的mysql5.7。

关于数据库的版本问题官方有很多提示,小伙伴们可以自行看,总结一点就是不要用太老的就行了。

  1. 安装mysql,不多说了,我的宝塔已经装好了。
  2. 新建数据库和用户。
    我用官方的原装命令提示我'access denied,于是我变通了一下,先进入mysql控制台,这里提示一下,要用root用户进入,root`密码的修改在这里:

进入控制台后,创建名为“xwiki“的数据库,编辑为utf8mb4,输入如下命令:

create database xwiki default character set utf8mb4 collate utf8mb4_bin;

创建用户名为“xwiki“,密码为"xwiki“的用户,命令如下:

CREATE USER 'xwiki'@'localhost' IDENTIFIED BY 'xwiki';

3.给xiwik用户全权授权。

grant all privileges on *.* to xwiki@localhost";

4.如果密码"xwiki"设的太简单,数据库的安全策略通不过,一是可以改成复杂密码,二是可以删除复杂密码的安全策略。删除命令如下:

uninstall plugin validate_password;

5.数据库与xwiki做连接。

打开WEB-INF/hibernate.cfg.xml文件,照下图配置:
文件在这里:

注释掉这段代码:

显示这段代码,并按照前面设定的数据库用户名和密码配置好:

至此mysql的配置告一段落。

0x02:安装xwiki的ui界面

如果上述都安装好以后,在浏览器里输入http://localhost:8080/xwiki,应该就可以进入安装界面了,终于看见曙光了。

这里有一个最重要的包就是flavor包,不装这个xwiki就是空白的,什么也干不了,这个包在官方可以下载。

一定要下载与你的xwiki安装包配套的flavor包,扩展名为xip

下载地址一般跟下载官方xwiki安装包在一起:

把这个包拷入永久目录下的,这个目录/extension/repository ,解压缩就可以了。

启动安装的时候,安装程序就自动找到这个包,见下图:

至于,一路continue下去,就可以装好了。

下一步继续研究xwiki的强大功能了。

暂无评论 >_<

悄悄话

搜索