禅道集成OnlyOffice-使用httpd反向代理

124 阅读4分钟

前言

禅道集成OnlyOffice时,为了避免跨域问题(虽然OnlyOffice已经做好跨域),需要将OnlyOffice的地址引入到和禅道同一域名下。

使用的是禅道的官方docker镜像:hub.zentao.net/app/zentao:latest ,其hash值为: sha256:4c0d2bc36dbee2433e9a01348298fd4dff3c15f5afb3a5cf83dd1f1d1fa99071

以这个镜像为基础:

  • 禅道版本:21.7
  • httpd版本:2.4.62
  • 升级到了禅道21.7.4
  • 宿主机工作目录:/data/zentao

由于官方镜像中的httpd没有反向代理的模块,所以需要先编译httpd的模块。

任务列表如下:

  1. 编译httpd-2.4.62
  2. 将编译好的httpd模块替换容器中的module目录
  3. 修改禅道镜像httpd配置文件
  4. 测试

任务开始

1. 编译httpd

编译使用的环境,直接用禅道的docker镜像来进行编译,这样避免环境兼容问题。禅道的docker用的是debain。我们可以使用Dockerfile来准备编译环境,也可以用禅道镜像启动一个容器,在容器里直接操作。

这里选择在容器里直接操作。

启动容器:

docker run -it zentao_test bash

【容器内】安装编译环境

禅道的镜像,已经将apt源改为了腾讯的镜像,所以直接进行安装。

更新apt缓存

apt update

安装编译工具和依赖包

apt install build-essential zlib1g-dev libncurses5-dev \
libgdbm-dev libnss3-dev libssl-dev libreadline-dev \
libffi-dev libapr1 libaprutil1 libapr1-dev libaprutil1-dev

【容器内】下载并编译httpd

由于httpd的2.4.62已经是旧版本,所以要从archive.apache.org下载源码包

wget https://archive.apache.org/dist/httpd/httpd-2.4.62.tar.gz

解压

tar zxf httpd-2.4.62.tar.gz

进入到httpd-2.4.62源码目录,进行配置、编译、安装

./configure --prefix=/opt/zbox/run/apache --enable-so --enable-modules="all"
make -j
make install

httpd编译成功

2. 替换容器的httpd模块

【宿主机】导出httpd模块

在宿主机上执行如下命令

docker cp zentao_test:/opt/zbox/run/apache/modules ./apache_modules

【宿主机】修改禅道docker-compose.yml

加入如下volumes映射

services:
  zentao:
    volumes:
      - ./apache_modules:/opt/zbox/run/apache/modules

3. 修改httpd.conf.tpl文件

【宿主机】导出配置文件模板

docker cp zentao_test:/opt/zbox/etc/apache/httpd.conf.tpl ./apache/

【宿主机】修改配置文件模板

完整内容如下

# httpd.conf

ServerRoot      "/opt/zbox/run/apache"
PidFile         /opt/zbox/tmp/apache/httpd.pid
DocumentRoot    "{{DOCUMENT_ROOT}}"

Listen          {{APP_DEFAULT_PORT}}
User            nobody
Group           nogroup

ServerAdmin     zentao@localhost.net

ServerName      localhost

EnableMMAP      off
EnableSendfile  off

TypesConfig     /opt/zbox/etc/apache/mime.types

# performance settings.
Timeout                 300
KeepAlive               On
MaxKeepAliveRequests    100
KeepAliveTimeout        10
UseCanonicalName        Off
HostnameLookups         Off

# security.

ServerTokens            Prod
ServerSignature         Off

# deflat.
AddType image/x-icon .ico
AddType image/gif .gif
AddType image/jpeg .jpg .jpeg
AddType image/png .png
AddType application/javascript .js
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/css application/javascript

# modules.
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
<IfModule mpm_prefork_module>
	StartServers            5
	MinSpareServers         5
	MaxSpareServers         10
	MaxRequestWorkers       150
	MaxConnectionsPerChild  0
</IfModule>

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule alias_module modules/mod_alias.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule filter_module modules/mod_filter.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so


SSLSessionCache         "shmcb:/opt/zbox/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300

# php module.
{{#if PHP_VERSION_8}}
LoadModule php_module modules/libphp.so
<IfModule php_module>
    DirectoryIndex index.html default.php index.php
    AddHandler application/x-httpd-php .php
</IfModule>
 {{else}}
LoadModule php7_module modules/libphp.so
<IfModule php7_module>
    DirectoryIndex index.html default.php index.php
    AddHandler application/x-httpd-php .php
</IfModule>
 {{/if}}

AddType application/x-httpd-php .php .php3 .php4

<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    Require all denied
</FilesMatch>

# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
    Require all denied
</FilesMatch>

<Files ".zt*">
  Require all denied
</Files>

<Files ".ht*">
  Require all denied
</Files>

# directory settings.
DirectoryIndex index.html index.htm index.php

# logs
ErrorLog "/dev/stderr"
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "/dev/stdout" combined

<Directory "/apps/zentao/www">
  Options  FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

{{#if ZT_WEB_ROOT}}
  Alias {{ZT_WEB_ROOT}} "/apps/zentao/www"
 {{/if}}

<VirtualHost *:{{APP_DEFAULT_PORT}}>
 ServerAdmin zentao@local.net
 DocumentRoot "{{DOCUMENT_ROOT}}"
 ServerName localhost
 
 <Directory />
   AllowOverride all
   Require all granted
 </Directory>

# setting for admin
 Alias /adminer "{{DOCUMENT_ROOT}}/dbview"
 {{#if ZT_WEB_ROOT}}
  Alias {{ZT_WEB_ROOT}}/adminer "{{DOCUMENT_ROOT}}/dbview"
 {{/if}}
 <Directory "{{DOCUMENT_ROOT}}/dbview">
    DirectoryIndex index.php
    <Files "index.php">
        SetHandler application/x-httpd-php
    </Files>
 </Directory>
 <DirectoryMatch "{{DOCUMENT_ROOT}}/dbview/.+/.*">
    <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
        SetHandler text/plain
    </FilesMatch>
 </DirectoryMatch>

 Define ONLYOFFICE_VPATH /onlyoffice-service
 Define DS_ADDRESS 192.168.1.88:1234

 <Location ${ONLYOFFICE_VPATH}>
  Require all granted
  SetEnvIf Host "^(.*)$" THE_HOST=$1
  RequestHeader setifempty X-Forwarded-Proto http
  RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
  RequestHeader edit X-Forwarded-Host (.*) $1${ONLYOFFICE_VPATH}
  ProxyAddHeaders Off
 </Location>

 RewriteEngine on
 RewriteCond %{HTTP:Upgrade} websocket [NC]
 RewriteCond %{HTTP:Connection} upgrade [NC]
 RewriteRule ^\${ONLYOFFICE_VPATH}/?(.*) "ws://${DS_ADDRESS}/$1" [P,L]
 ProxyPass ${ONLYOFFICE_VPATH} "http://${DS_ADDRESS}"
 ProxyPassReverse ${ONLYOFFICE_VPATH} "http://${DS_ADDRESS}"

 
 ErrorLog "/dev/stderr"
 CustomLog "/dev/stdout" combined
</VirtualHost>

TraceEnable off

【宿主机】修改禅道docker-compose.yml

加入如下volumes映射

services:
  zentao:
    volumes:
      - ./apache/httpd.conf.tpl:/opt/zbox/etc/apache/httpd.conf.tpl

4. 测试

打开浏览器,访问禅道地址:http://zentaohost/onlyoffice-service/

浏览器会自动跳转到:http://zentaohost/onlyoffice-service/welcome/

测试成功

附录

docker-compose.yaml中完整的禅道配置

servers:
  zentao:
    image: hub.zentao.net/app/zentao
    container_name: zentao1
    ports:
      - 8089:80
    environment:
      - TZ=Area/Shanghai
      - MYSQL_INTERNAL=false
      - ZT_MYSQL_HOST=192.168.1.88
      - ZT_MYSQL_PORT=3336
      - ZT_MYSQL_USER=root
      - ZT_MYSQL_PASSWORD=12345678
      - ZT_MYSQL_DB=zentao
      - GIT_TYPE=gitea
      - GIT_DOMAIN=http://192.168.1.88:3000
      - GIT_USERNAME=gitea
      - GIT_PASSWORD=gitea
      - GIT_PROTOCOL=http
      - IS_CONTAINER=true
      - PHP_UPLOAD_MAX_FILESIZE=512M
      - PHP_POST_MAX_SIZE=512M
      - ZT_DEBUG=1
    volumes:
      - ./zentao/data:/data
      - ./src/zentao:/apps/zentao
      - ./apache_modules:/opt/zbox/run/apache/modules
      - ./apache/httpd.conf.tpl:/opt/zbox/etc/apache/httpd.conf.tpl
    restart: always
    privileged: true