更加推荐通过 Podman/Docker 方式进行部署,参考链接 Ubuntu 22.04使用Podman部署OpenGrok的详细教程 。
OpenGrok 是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。接下来就具体讲解 `Ubuntu 16.04/18.04/20.04 LTS` 环境下 `OpenGrok` 的安装及使用。
`OpenGrok 1.3.11/1.3.16` 依赖 `Java 1.8` , `Tomcat 8`
`OpenGrok 1.5.12` 依赖 `Java 11` , `Tomcat 9` 。
从 `OpenGrok 1.6.0`开始依赖 `Java 11` , `Tomcat 10` 。
1.依旧参照 UBUNTU 13.10 APACHE 2.2 通过 AJP 整合 TOMCAT 7 中讲述的方法,进行 `Tomcat 8/9`, `Apache 2.4`的配置安装,只不过路径中的 `Tomcat7` 目录替换成 `Tomcat8` (ubuntu 20.04 默认 `Tomcat9`)。
2.安装 `Tomcat 8` (ubuntu 18.04)
$ sudo apt-get install tomcat8
# 一般卸载 tomcat7
$ sudo apt-get remove --purge tomcat7*
# 调整内存,默认的128MB 默认配置运行会导致OOM
$ sudo touch /usr/share/tomcat8/bin/setenv.sh
$ echo 'export JAVA_OPTS="-Xms512M -Xmx1024M"' | sudo tee -a /usr/share/tomcat8/bin/setenv.sh
安装 `Tomcat 9` (ubuntu 20.04)
# 一般卸载 tomcat7/8
$ sudo apt-get remove --purge tomcat7*
$ sudo apt-get remove --purge tomcat8*
$ sudo apt-get install tomcat9
# 调整内存,默认的128MB 默认配置运行会导致OOM
# sudo touch /usr/share/tomcat9/bin/setenv.sh
$ echo 'export JAVA_OPTS="-Xms512M -Xmx1024M"' | sudo tee -a /usr/share/tomcat9/bin/setenv.sh
3.安装 `universal-ctags` 用于对 `C\C++` 代码的支持
给代码建立索引时,要使用到universal-ctags
工具,但是一般通过apt-get安装的都是exuberant-ctags
,所以要先删除原有的ctags版本,然后安装universal-ctags
.
$ sudo apt-get purge ctags
$ sudo apt-get install git
$ sudo apt-get install autoconf
$ sudo apt-get install pkg-config
$ cd ~
$ git clone --depth=1 https://github.com/universal-ctags/ctags.git
$ cd ctags
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ cd ..
$ rm -rf ctags
4.下载并安装OpenGrok
可以到"https://oracle.github.io/opengrok/"手工下载文件,然后上传到服务器,也可以直接用wget
命令来下载,一般选择安装在"/opt
"目录下面。
$ sudo apt-get install aria2
$ cd /opt
$ sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.3.11/opengrok-1.3.11.tar.gz"
# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.3.16/opengrok-1.3.16.tar.gz"
# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.5.12/opengrok-1.5.12.tar.gz"
# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.7.25/opengrok-1.7.25.tar.gz"
解压缩文件到当前目录"/opt
"
$ sudo tar xvf opengrok-1.3.11.tar.gz
# sudo tar xvf opengrok-1.3.16.tar.gz
# sudo tar xvf opengrok-1.5.12.tar.gz
# sudo tar xvf opengrok-1.7.25.tar.gz
创建一个软链接,方便后续的修改
$ sudo ln -s opengrok-1.3.11 /opt/opengrok
# sudo ln -s opengrok-1.3.16 /opt/opengrok
# sudo ln -s opengrok-1.5.12 /opt/opengrok
# sudo ln -s opengrok-1.7.25 /opt/opengrok
# 安装工具,必须是Python3 ,Python2 安装会失败
$ sudo apt-get install python3-pip
$ sudo pip3 install --upgrade pip
# 如果报错 ModuleNotFoundError: No module named 'pip._internal'
# 执行如下命令
# sudo python3 -m pip install --upgrade pip
# 解决 AttributeError: module 'setuptools.dist' has no attribute 'check_specifier'
$ sudo pip3 install --upgrade setuptools
$ sudo pip3 install /opt/opengrok/tools/opengrok-tools.tar.gz
链接"`/opt/opengrok/lib/source.war`"到 `Tomcat8` 的工程目录"`/var/lib/tomcat8/webapps/`",比如我们有多个源代码工程,建议进行链接操作。
如下:
$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_4.2.2.war
$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_7.0.0_r21.war
$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_10.0.0_r40.war
$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Chromium.war
访问"http://localhost:8080/source/"确认OpenGrok是否已经安装成功,如果安装成功,出现下面的界面:
5.出于安全原因,禁止外网访问Tomcat的8080端口
只允许Tomcat在本地的8080端口监听即可,修改
$ sudo vim /var/lib/tomcat8/conf/server.xml
添加 address="127.0.0.1"
<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
重启Tomcat8
$ sudo service tomcat8 restart
6.配置Apache2对Tomcat通过AJP进行反向代理
`Apache2` 的配置文件“ `/etc/apache2/sites-enabled/000-default.conf`” (如果开启了HTTPS,则需要同步修改 `/etc/apache2/sites-enabled/000-default-le-ssl.conf` 或者 `/etc/apache2/sites-enabled/default-ssl.conf`) 中,增加如下配置:
<VirtualHost *:80>
#for Tomcat 8 openGrok Android Source
ProxyPass /Android_4.2.2/ ajp://127.0.0.1:8009/Android_4.2.2/
ProxyPassReverse /AndroidXRef_4.2.2/ ajp://127.0.0.1:8009/AndroidXRef_4.2.2/
ProxyPass /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
ProxyPassReverse /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
ProxyPass /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/
ProxyPassReverse /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/
#for Tomcat 8 OpenGrok Chromium
ProxyPass /Chromium/ ajp://127.0.0.1:8009/Chromium/
ProxyPassReverse /Chromium/ ajp://127.0.0.1:8009/Chromium/
</VirtualHost>
`Tomcat8` 的配置文件/var/lib/tomcat8/conf/server.xml
中增加如下配置<Context path="/Android_4.2.2" docBase="Android_4.2.2/"/>,解决跳转404问题。ProxyPass
后面必须携带“/”,否则就会出现404问题。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/Android_4.2.2" docBase="Android_4.2.2/"/>
<Context path="/Android_7.0.0.r21" docBase="Android_7.0.0_r21/"/>
<Context path="/Android_10.0.0_r40" docBase="Android_10.0.0_r40/"/>
<Context path="/Chromium" docBase="Chromium/"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 隐藏版本号 -->
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
</Host>
7.配置OpenGrok
对源代码进行解析
设置要建立索引的源代码目录的位置,以存储在"/data/OpenGrok/Android_4.2.2
"上的Android
代码为例子:
$ export OPENGROK_INSTANCE_BASE=/data/OpenGrok/Android_4.2.2/
$ export OPENGROK_WEBAPP_CONTEXT=Android_4.2.2
注意:
由于我们使用了Apache2的反向代理才需要设置 `OPENGROK_WEBAPP_CONTEXT`,如果没有设置反向代理,请不要设置。
`OPENGROK_WEBAPP_CONTEXT` 内容就是在 `Apache2` 中设置的 `ProxyPassReverse` 指定的参数。
在使用反向代理的时候如果不设置OPENGROK_WEBAPP_CONTEXT
会导致在点击具体的变量定义的时候,出现404。
不使用反向代理的时候请只设置OPENGROK_INSTANCE_BASE
。
这个变量的本质功能就是在建立文件索引的时候,在链接头部增加 OPENGROK_WEBAPP_CONTEXT
指定的路径,比如原来的路径是 https://www.mobibrw.com/a.html ,那么指定路径后,就变成了 https://www.mobibrw.com/ Android_4.2.2/a.html。
创建源代码索引
$ cd /data/OpenGrok/Android_4.2.2/src
# 删除源代码下面可能存在的".git",".svn"隐藏目录
$ find . -name .svn -print0 | xargs -0 rm -r -f
$ find . -name .git -print0 | xargs -0 rm -r -f
# 删除无法进行索引的文件
$ find . -name *.apk -print0 | xargs -0 rm -r -f
$ find . -name *.zip -print0 | xargs -0 rm -r -f
$ find . -name *.jar -print0 | xargs -0 rm -r -f
# 编译工具是没有必要的目录
$ rm -rf prebuilts
$ export IDX_ROOT=/data/OpenGrok/Android_4.2.2/
# Android 源代码目录
$ export IDX_SRC=${IDX_ROOT}src/
$ export IDX_DATA=${IDX_ROOT}data/
$ export IDX_CONF=${IDX_ROOT}etc/configuration.xml
# 清理以前生成的索引数据
# 索引数据目录
$ cd ${IDX_ROOT}
$ rm -rf data
# 日志目录
$ rm -rf log
# 配置文件目录
$ rm -rf etc
$ rm -rf logging.properties
$ mkdir etc
# 限制索引内存占用,避免建立索引过程中引发OOM,
# 如果依旧出现OOM,则在参数中指定 “-T 1” 限制只能使用一个线程,不允许并发,减少内存开销
# 其实由于磁盘IO是整个索引的性能瓶颈,因此多线程并不能缩短太多的时间,反而占用了太多的内存
# 因此限制只能使用一个线程,在大多数情况下,是没问题的
# 同时使用 "-m 256" 参数增加 Lucene 4.x 使用的缓存的大小,避免出现问题
# Android 10的源代码至少需要2GB内存才能成功索引
$ export JAVA_OPTS="-Xmx2048m"
$ opengrok-indexer -J=-Xmx2g -a /opt/opengrok/lib/opengrok.jar -- -m 256 -s $IDX_SRC -d $IDX_DATA -T 1 -H -P -S -G -W $IDX_CONF
执行时间在40分钟左右,执行完成 。(如果通过SSH远程登录,可能会出现中途连接断开的情况,原因为某项操作比较耗时,导致长时间没有数据通信,网络超时断开。 参考 Linux SSH保持连接(解决Broken pipe))生成的索引文件在源代码的"data
"目录下面,重建索引的时候需要执行如下操作,才能再次建立索引
# 切换回到项目根目录
$ cd ${IDX_ROOT}
# 索引数据目录
$ rm -rf data
# 日志目录
$ rm -rf log
# 配置文件目录
$ rm -rf etc
$ rm -rf logging.properties
注意,请务必删除源代码中的"prebuilts"目录,这个目录下面存储的是一系列的编译工具,在浏览代码的时候,完全用不上,但是占据的磁盘空间确是巨大的。
注意,如果服务器上面的内存比较有限,请使用如下命令进行内存限制,否则建立索引的时候,会触发内存不足的情况:
# 早期版本使用如下参数限制内存
$ export JAVA_OPTS="-Xmx1024m"
# 最新版本OpenGrok-1.3.11/1.3.16使用-J=-Xmx2g 进行内存限制,Android 10的源代码至少需要2GB内存才能成功索引
修改OpenGrok
配置文件
$ sudo vim /var/lib/tomcat8/webapps/Android_4.2.2/WEB-INF/web.xml
修改其中的
<context-param>
<param-name>CONFIGURATION</param-name>
<param-value>/var/opengrok/etc/configuration.xml</param-value>
<description>Full path to the configuration file where OpenGrok can read it's configuration</description>
</context-param>
为具体的工程目录"/data/OpenGrok/Android_4.2.2
",修改后的配置如下:
<context-param>
<param-name>CONFIGURATION</param-name>
<param-value>/data/OpenGrok/Android_4.2.2/etc/configuration.xml</param-value>
<description>Full path to the configuration file where OpenGrok can read it's configuration</description>
</context-param>
刷新浏览器,可以看到Android_4.2.2
的源码可以搜索出来了。
参考链接