更加推荐通过 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)
1 2 3 4 5 6 7 8 9 10 |
$ 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)
1 2 3 4 5 6 7 8 9 10 11 12 |
# 一般卸载 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
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ 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
"目录下面。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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
"
1 2 3 4 5 6 7 |
$ 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 |
创建一个软链接,方便后续的修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ 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/
",比如我们有多个源代码工程,建议进行链接操作。
如下:
1 2 3 4 5 6 7 |
$ 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端口监听即可,修改
1 |
$ sudo vim /var/lib/tomcat8/conf/server.xml |
添加 address="127.0.0.1"
1 2 3 |
<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
重启Tomcat8
1 |
$ 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
) 中,增加如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<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问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<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
代码为例子:
1 2 3 |
$ 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。
创建源代码索引
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
$ 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
"目录下面,重建索引的时候需要执行如下操作,才能再次建立索引
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 切换回到项目根目录 $ cd ${IDX_ROOT} # 索引数据目录 $ rm -rf data # 日志目录 $ rm -rf log # 配置文件目录 $ rm -rf etc $ rm -rf logging.properties |
注意,请务必删除源代码中的"prebuilts"目录,这个目录下面存储的是一系列的编译工具,在浏览代码的时候,完全用不上,但是占据的磁盘空间确是巨大的。
注意,如果服务器上面的内存比较有限,请使用如下命令进行内存限制,否则建立索引的时候,会触发内存不足的情况:
1 2 3 4 |
# 早期版本使用如下参数限制内存 $ export JAVA_OPTS="-Xmx1024m" # 最新版本OpenGrok-1.3.11/1.3.16使用-J=-Xmx2g 进行内存限制,Android 10的源代码至少需要2GB内存才能成功索引 |
修改OpenGrok
配置文件
1 |
$ sudo vim /var/lib/tomcat8/webapps/Android_4.2.2/WEB-INF/web.xml |
修改其中的
1 2 3 4 5 |
<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
",修改后的配置如下:
1 2 3 4 5 |
<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
的源码可以搜索出来了。
参考链接
- Android系统源码极速搜索引擎(OpenGrok)
- Linux下Opengrok安装部署与使用
- 在Ubuntu 12.04.2 LTS上安装OpenGrok浏览Android源码
- 在Ubuntu 12.04 LTS上安装OpenGrok浏览Android源码
- Opengrok的安装及配置
- 解决“ImportError: 'module' object has no attribute 'check_specifier'”
- 在阿里云的Ubuntu 14.04系统上解决Tomcat 7由于OOM(Out Of Memory)而被系统杀掉的问题
- 在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1
- indexer of AOSP fails with OutOfMemoryError and other exceptions #2647
- Tuning for large code bases
- OutOfMemoryError when indexing AOSP #2074
- Ubuntu Server 18.04 LTS隐藏Tomcat-9.0.16.0的版本号与操作系统类型