############################################################ # Apache 子域名反向代理配置(jiao77.cn) # # 说明: # - 避免子路径带来的静态资源/重写/WS 问题,每个服务独立子域名 # - 统一在 443 终止 TLS,Apache 反代到本地端口服务 # - 主站 jiao77.cn 使用 Docker 容器部署(端口 3001) # - API 后端服务使用 Docker 容器部署(端口 3000) # # 前置: # - DNS 为以下子域名添加 A/AAAA 记录 -> 服务器 IP # - 证书需覆盖所有子域(通配符 *.jiao77.cn 或 SAN 多域名证书) # - 启用模块:ssl headers proxy proxy_http proxy_wstunnel rewrite deflate cache cache_disk expires # # 部署: # - 放置到 /etc/apache2/sites-available/jiao77-subdomains.conf # - sudo a2enmod ssl headers proxy proxy_http proxy_wstunnel rewrite deflate cache cache_disk expires # - sudo a2ensite jiao77-subdomains && sudo systemctl reload apache2 ############################################################ # ============ 主站(前端 Docker 容器) ============ ServerName jiao77.cn ServerAlias www.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://jiao77.cn/$1 [R=301,L] ServerName jiao77.cn ServerAlias www.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:!aNULL:!MD5 # 安全头配置 Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set Referrer-Policy "no-referrer-when-downgrade" # 代理配置 ProxyPreserveHost On ProxyRequests Off RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s" # 缓存策略(VirtualHost 级别) # 注意:一些缓存指令(如 CacheIgnoreHeaders)不允许放在 中 # 因此在虚拟主机级别声明,以便对下方的缓存生效 CacheIgnoreHeaders Set-Cookie # ============ API 后端代理 ============ # 暂时注释掉 API 代理,如果需要可以取消注释 # 健康检查(不记录日志) # # ProxyPass http://127.0.0.1:3000/health # ProxyPassReverse http://127.0.0.1:3000/health # SetEnv no-log 1 # # API 接口代理 # 关键:使用 并带尾部斜杠,确保路径正确传递 # # ProxyPass http://127.0.0.1:3000/api/ # ProxyPassReverse http://127.0.0.1:3000/api/ # # # API 缓存配置(10分钟) # CacheEnable disk # CacheHeader on # CacheDefaultExpire 600 # CacheMaxExpire 600 # # ============ 静态资源缓存 ============ # 由于现在直接使用静态文件服务,这个 LocationMatch 可以移除 # 静态资源缓存已在下面的 Directory 配置中处理 # ============ 前端应用代理(默认) ============ # 直接提供静态文件服务,不使用 Docker 容器 DocumentRoot /var/www/jiao77.cn DirectoryIndex index.html # 静态文件处理 Options -Indexes +FollowSymLinks AllowOverride All Require all granted # 对静态资源启用缓存 ExpiresActive On ExpiresDefault "access plus 30 days" Header set Cache-Control "public, max-age=2592000, immutable" # Gzip 压缩配置 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/javascript application/json AddOutputFilterByType DEFLATE application/xml application/rss+xml ErrorLog ${APACHE_LOG_DIR}/jiao77-main-error.log CustomLog ${APACHE_LOG_DIR}/jiao77-main-access.log combined # 公共代理选项 SSLProxyEngine on # ============ Gitea ============ ServerName gitea.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://gitea.jiao77.cn/$1 [R=301,L] ServerName gitea.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:3012/ ProxyPassReverse / http://127.0.0.1:3012/ ErrorLog ${APACHE_LOG_DIR}/gitea-error.log CustomLog ${APACHE_LOG_DIR}/gitea-access.log combined # ============ AList ============ ServerName alist.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://alist.jiao77.cn/$1 [R=301,L] ServerName alist.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" # 如果 AList 后端是 HTTPS(如 52443),保持 https 代理;若是 http,改为 http://127.0.0.1: ProxyPass / https://127.0.0.1:52443/ ProxyPassReverse / https://127.0.0.1:52443/ ErrorLog ${APACHE_LOG_DIR}/alist-error.log CustomLog ${APACHE_LOG_DIR}/alist-access.log combined # ============ Q-Nas ============ ServerName qnas.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://qnas.jiao77.cn/$1 [R=301,L] ServerName qnas.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:5666/ ProxyPassReverse / http://127.0.0.1:5666/ ErrorLog ${APACHE_LOG_DIR}/qnas-error.log CustomLog ${APACHE_LOG_DIR}/qnas-access.log combined # ============ nuc-Nas ============ ServerName nucnas.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://nucnas.jiao77.cn/$1 [R=301,L] ServerName nucnas.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:56661/ ProxyPassReverse / http://127.0.0.1:56661/ ErrorLog ${APACHE_LOG_DIR}/nucnas-error.log CustomLog ${APACHE_LOG_DIR}/nucnas-access.log combined # ============ RAGflow ============ ServerName ragflow.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://ragflow.jiao77.cn/$1 [R=301,L] ServerName ragflow.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:28081/ ProxyPassReverse / http://127.0.0.1:28081/ ErrorLog ${APACHE_LOG_DIR}/ragflow-error.log CustomLog ${APACHE_LOG_DIR}/ragflow-access.log combined # ============ Open WebUI ============ ServerName ai.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://ai.jiao77.cn/$1 [R=301,L] ServerName ai.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:38080/ ProxyPassReverse / http://127.0.0.1:38080/ # 常见 WebSocket 路径(按需调整) ProxyPass /ws ws://127.0.0.1:38080/ws ProxyPassReverse /ws ws://127.0.0.1:38080/ws ErrorLog ${APACHE_LOG_DIR}/ai-error.log CustomLog ${APACHE_LOG_DIR}/ai-access.log combined # ============ Navidrome ============ ServerName music.jiao77.cn RewriteEngine On RewriteRule ^/(.*)$ https://music.jiao77.cn/$1 [R=301,L] ServerName music.jiao77.cn SSLEngine on SSLCertificateFile /etc/ssl/jiao77/cert.pem SSLCertificateKeyFile /etc/ssl/jiao77/key.pem SSLCertificateChainFile /etc/ssl/jiao77/chain.pem ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyPass / http://127.0.0.1:45332/ ProxyPassReverse / http://127.0.0.1:45332/ ErrorLog ${APACHE_LOG_DIR}/music-error.log CustomLog ${APACHE_LOG_DIR}/music-access.log combined # ============ 缓存配置 ============ CacheRoot /var/cache/apache2/jiao77 CacheDirLevels 2 CacheDirLength 1 CacheMaxFileSize 10000000 CacheMinFileSize 1 CacheReadSize 0 CacheReadTime 3000