当前位置: 首页 > Linux

[Apache][Nginx]构建仅对团队内部公开使用的web应用

时间:2023-04-07 00:01:32 Linux

[Apache][Nginx]搭建一个只在团队内部公开使用的web应用,但是有如下要求:尽量方便使用因为是研究室的系统,所以需要保证隐私。对于第一点,我想过两种解决方案。第一种是延续往年的解决方案:使用开源软件GROWI直接重新构建一个轻量级的信息分享系统,但是在看文档准备安装docker搭建项目的时候,听说GROWI提供的服务器配置professor是CPU:2核,内存:1G,服务器第一次直??接宕机。是的,对于一个还同时运行其他服务的谨慎服务器使用docker有点牵强,所以我放弃了这个方案(后来发现GROWI官方提供了基于NodeJS的安装指南);二是使用Gitbook搭建静态文档站点当时我第一反应想到Gitbook主要是因为它的流行。当我真正去原来的repo查看部署计划时,我发现该项目几乎停止了维护。Gitbook团队似乎一直专注于Gitbook的商业化,希望有更好的用途。体验只能去官网注册账号使用云服务,这显然违背了本次任务的隐私和定制化要求,所以选择了寻找Gitbook的替代方案。最后,我找到了Docsify。本文主要针对前言中需求2的实现。实现思路是利用前端服务器(即中间服务器)反向代理客户端的应用请求,将请求转发给实际部署应用的后端应用服务器。对于同一台机器(假设应用实际部署在2367端口),默认情况下,前端相当于一个监听本机80端口的虚拟服务器(本文使用Apache),而后端-end相当于一个监听2367端口的虚拟服务器(本文使用的是Nginx)。Nginx与Apache的区别:Nginx高度模块化,易于编写和配置,静态文件的处理速度高于Apache。占用内存少,并发性好(异步非阻塞型)。它适用于前端服务器。因此,在选择其中一台Web服务器搭建项目时,如果追求项目性能,可以使用Nginx;如果您正在寻找稳定性和更多配置选项,建议使用Apache。两者结合,Nginx更适合作为前端负载均衡和反向代理,Apache作为后端服务器处理动态请求。本文基于已有配置(Apache监听80端口),不便修改配置。Apache用作前端反向代理。这种方法不建议盲目模仿,要根据实际情况进行调整。搭建流程具体搭建流程如下图所示:左边绿色方框代表基于Apache搭建的反向代理服务器,右边粉色方框代表基于Nginx搭建的应用服务器。反向代理服务器除了基本的反向代理配置外,还增加了一层ip过滤,防止校园网外的ip访问(因为我的需求,申请的受访者是校研办);除了在应用服务器上配置应用程序外,还添加了一个登录验证链接(用户名和密码)以过滤来自研究实验室成员的访问。在Apache和Nginx之间加入白名单,使得应用服务器只能接受来自反向代理服务器的请求(这样即使检测到应用的外部地址也无法直接访问)。反向代理Apache配置如下:#Includemoduleconfiguration:IncludeOptionalmods-enabled/*.loadIncludeOptionalmods-enabled/*.conf#Includeports.conf#NameVirtualHost*:443ServerNameabc.example.comServerAliasabc.example.comProxyRequestsOffRequireipyyy.yyy.yyy.yyy/zzProxyPass/http://xxx.xxx.xxx.xxx:2367/ProxyPassReverse/http://xxx.xxx.xxx.xxx:2367SSLCertificateFile"/path/to/your/sslcert/fullchain.pem"SSLCertificateKeyFile"/path/to/your/sslcert/privkey.pem"需要注意的是Apache的反向代理功能需要手动开启。首先需要将mod_proxy、mod_proxy_http.so、mod_proxy_connect.so这三个模块导入到apache.conf中。如果你是FreeBSD,只需要取消httpd.conf的注释,重启服务即可;但是如果你使用的是Ubuntu,使用sites-available和sites-enabled一样的方法,mods-available是所有模块的存放目录,只是服务加载的模块存放在mods-enabled中。apache.conf中的以下行证实了这一点:#Includemoduleconfiguration:IncludeOptionalmods-enabled/*.loadIncludeOptionalmods-enabled/*.conf当apache服务运行时,只有mods-enabled中的模块被加载,一些安装期间默认不加载模块。(即模块不会出现在mods-enabled中)Apache为我们提供了a2enmod命令帮助我们快速添加模块,相对停用模块使用a2dismod命令:admin@ubuntu:~$sudoa2enmodproxyproxy_httpproxy_connect#Enablemoduleadmin@ubuntu:~$sudoa2dismodproxyproxy_httpproxy_connect#disabled模块启用后,指定模块会以软链接的形式放入mods-enabled,重启服务生效。添加模块后,需要在apache.conf中添加如下一行开启反向代理功能。ProxyRequestsOff添加下面这行来设置你的代理目标ProxyPass/http://xxx.xxx.xxx.xxx:2367/ProxyPassReverse/http://xxx.xxx.xxx.xxx:2367添加ip白名单,具体可以指定ip,你也可以像我一样限制一个网段。Requireipyyy.yyy.yyy.yyy/zz添加https证书。关于代理服务器和应用服务器是否需要https,请参考反向代理服务器代理HTTPS。SSLCertificateFile"/path/to/your/sslcert/fullchain.pem"SSLCertificateKeyFile"/path/to/your/sslcert/privkey.pem"至此,反向代理服务器的配置就到这里了。应用服务器Nginx的配置如下。作者配置静态页面。对于php等动态应用,请根据Nginx文档进行调整:server{listen2367;听[::]:2367;根/路径/到/应用程序;#添加索引。如果您使用的是PHP索引index.htmlindex.htm,请将php添加到列表中;服务器名称_;auth_basic"请输入您的用户名和密码。";auth_basic_user_file/path/to/your/htpasswd;location/{#首先尝试将请求作为文件提供,然后#作为目录,然后退回到显示404。try_files$uri$uri/=404;别名/path/of/your/app/;索引index.html;}}以下开始说明。在/etc/nginx/sites-available/下新建一个默认模板的配置文件,软链接到/etc/nginx/sites-enabled/:sudotouch/etc/nginx/sites-available/mysite.confsudoln-s/etc/nginx/sites-available/mysite.conf/etc/nginx/sites-enabled/mysite.conf.enable使用绝对路径,否则会报错。应用的部署配置根据你的实际情况编写。登录验证通过nginx配置和htpasswd工具实现。htpasswd是Apache内置的用户名密码生成工具,使用方法如下:$htpasswd-c/usr/local/nginx/passwordusername#如果我们想把验证文件存放在/usr/local/nginx下/#filenameForpassword,登录用户名为username#回车后输入密码#-c创建加密文件登录信息创建完成,将验证信息写入网站配置文件:auth_basic"请输入您的密码用户名和密码。”;auth_basic_user_file/usr/local/nginx/password;实现效果如图:这个实现是最基本的验证功能,有一个缺陷就是不能设置登录过期时间,也就是说设备登录成功一次后,会一直保持登录成功状态,直到用户手动清除网站缓存。配置完成后重启nginx服务器即可生效。在代理服务器和应用服务器之间添加白名单的实现非常简单粗暴。直接在应用服务器(Nginx)上过滤除代理服务器以外的所有请求,添加如下配置即可。#白名单允许zzz.zzz.zzz.zzz;#反向代理服务器的地址denyall;除了ip后跟allow关键字之外的所有请求都将被拒绝。至此,所有实现的介绍都已经完成。参考:https://caloskao.org/ubuntu-a...https://www.cnblogs.com/kevin...https://segmentfault.com/a/11...