前言
研究室最近调配了个工作,要求在研究室服务器上架设一个信息共享零碎,便于高年级生毕业后做信息引继,但有以下要求:
- 应用尽可能不便
- 因为是面向钻研室内的零碎,因而私密性须要保障
对于第一点,我思考了两个计划,第一种是延用今年的解决方案:应用开源软件 GROWI 间接从新构建一个轻量的情报分享零碎,但当我翻阅文档筹备装置 docker 来构建我的项目时,才据说传授提供的服务器配置是
CPU:2 cores, Memory:1G
, 首次启动间接把服务器给 down 掉了,对于一个还同时运行其余服务的小心 server 应用 docker 未免有些牵强,因而我放弃了这个计划(起初才发现 GROWI 官网有提供基于 NodeJS 的装置指南); 第二种是应用 Gitbook 构建动态的文档站点,过后第一反馈想到 Gitbook 次要还是因为它的知名度,等我理论去原 repo 查阅部署计划时发现我的项目曾经简直进行保护,Gitbook 团队貌似曾经专一于 Gitbook 的商业化事业,想要有较好的应用体验只能去官网注册账号应用云服务,这与本次工作的私密性和定制化要求显然是相违反的, 因而我抉择去寻找 Gitbook 的代替产品。最终我找到了 Docsify.
本文次要就实现前言中的要求 2 进一步开展阐明。
实现的思路是利用前端服务器(即两头服务器)反向代理客户端的利用申请,并将申请转发到理论部署利用的后端应用服务器,对于同一台机器而言(假如利用理论部署在 2367 端口),在默认状况下前端相当于监听该机器 80 端口的虚构服务器(本文应用 Apache),后端相当于监听 2367 端口的虚构服务器(本文应用 Nginx).
对于 Nginx 和 Apache 的区别:
- Nginx 高度模块化设计,编写配置简略,解决动态文件速度高于 Apache,内存占用较少,同时并发性较好(异步非阻塞型),适宜做前端服务器
- Apache 十分稳固,动静页面解决能力高,模块十分丰盛,rewrite 性能弱小
因而对于独自抉择其中一种 web 服务器来构建我的项目时,如果谋求我的项目性能,能够应用 Nginx;绝对的如果谋求稳定性以及更多配置选项,倡议应用 Apache。对于两者联合应用来说,Nginx 更适宜作为前端来负责负载平衡和反向代理,将 Apache 用作后端服务器来解决动静申请。本文是在现有配置的根底(Apache 监听 80 端口)并且不不便批改配置的状况下,用 Apache 作为前端反向代理,并不自觉举荐仿造该做法,应依据理论状况进行调整。
构建过程
具体构建过程如下图所示:
右边的绿框示意基于 Apache 构建的反向代理服务器,左边的粉框示意基于 Nginx 构建的应用服务器。反向代理服务器除了根底的反向代理配置以外,还加了一层 ip 过滤,用来阻止校园网以外 ip(因为对于我的需要来说,利用的受访对象是学校研究室)的拜访;应用服务器上除了配置利用以外还减少了一个登录认证的环节(用户名明码)来过滤研究室成员以外的拜访。Apache 和 Nginx 间增加了个白名单,使得应用服务器只能承受来自反向代理服务器的申请(这样内部即便探测到利用的地址也无奈间接拜访)。
反向代理
Apache 的配置如下:
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
#NameVirtualHost *:443
<VirtualHost *:443>
ServerName abc.example.com
ServerAlias abc.example.com
ProxyRequests Off
<Proxy "*">
Require ip yyy.yyy.yyy.yyy/zz
</Proxy>
ProxyPass / http://xxx.xxx.xxx.xxx:2367/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:2367
SSLCertificateFile "/path/to/your/sslcert/fullchain.pem"
SSLCertificateKeyFile "/path/to/your/sslcert/privkey.pem"
</VirtualHost>
其中要留神的是,Apache 的反向代理性能是须要手动开启的。首先须要向 apache.conf
里导入 mod_proxy
,mod_proxy_http.so
,mod_proxy_connect.so
这三个模块。如果你是 FreeBSD,你只须要在 httpd.conf
上把正文勾销掉,并重启服务后就能够了;但如果你应用的是 Ubuntu,与 sites-available
和sites-enabled
的应用办法雷同,mods-available
是所有模块的存储目录,然而服务载入的模块是存储在 mods-enabled
的。
这一点通过 apache.conf
的以下几行能够证实:
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
当 apache 服务运行时,只载入 mods-enabled
外面的模组,而局部模组在装置时预设是不会加载的。(即该模组不会呈现在mods-enabled
)
Apache 给咱们提供了 a2enmod
指令帮忙咱们疾速增加模块, 绝对的停用模块应用 a2dismod
命令:
admin@ubuntu:~$ sudo a2enmod proxy proxy_http proxy_connect # 启用模块
admin@ubuntu:~$ sudo a2dismod proxy proxy_http proxy_connect # 停用模块
启用之后,指定的模块会以软链接的模式被放进 mods-enabled
中,重启服务失效。
增加模块之后,须要在 apache.conf
中增加如下行即可启用反向代理性能。
ProxyRequests Off
增加如下行设置你的代理指标
ProxyPass / http://xxx.xxx.xxx.xxx:2367/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:2367
增加 ip 白名单,你能够指定具体 ip,也能够像我一样限定一个网段。
<Proxy "*">
Require ip yyy.yyy.yyy.yyy/zz
</Proxy>
增加 https 证书,对于代理服务器与应用服务器是否须要 https 这一点能够参考反向代理服务器代理 HTTPS。
SSLCertificateFile "/path/to/your/sslcert/fullchain.pem"
SSLCertificateKeyFile "/path/to/your/sslcert/privkey.pem"
至此,反向代理服务器的配置到此为止。
应用服务器
Nginx 的配置如下,笔者配置的是动态页面,php 等动静利用请依据 Nginx 文档自行调整:
server {
listen 2367;
listen [::]:2367;
root /path/to/app;
# Add index.php to the list if you are using PHP
index index.html index.htm;
server_name _;
auth_basic "Please enter your username and password.";
auth_basic_user_file /path/to/your/htpasswd;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
alias /path/of/your/app/;
index index.html;
}
}
以下开始阐明。在 /etc/nginx/sites-availble/
下以默认模板创立一个全新的配置文件,将其软链接到/etc/nginx/sites-enabled/
:
sudo touch /etc/nginx/sites-available/mysite.conf
sudo ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf.enable
应用绝对路径,不然会报错。
利用的部署配置,依据你的理论状况进行编写。
登录验证咱们通过 nginx 配置以及 htpasswd 工具实现。htpasswd 是一款 Apache 内置的用户名明码生成工具,应用办法如下:
$ htpasswd -c /usr/local/nginx/password username
# 如果咱们想将验证文件贮存在 /usr/local/nginx/ 下
# 文件名为 password,登录用户名为 username
# 回车后输出明码
# -c 创立加密文件
至此登录信息创立结束,将验证信息写入网站配置文件中:
auth_basic "Please enter your username and password.";
auth_basic_user_file /usr/local/nginx/password;
实现成果如图所示:
该实现是一个最根本的验证性能,它有一个缺点在于你无奈设定登录过期工夫,也就是说某台设施一次登录胜利后它将始终放弃登录胜利状态,直到网站 cache 被使用者手动革除。
配置实现后,重启 nginx 服务器失效。
代理服务器与应用服务器之间增加白名单
这部分实现很简略粗犷,间接在应用服务器上(Nginx)过滤除代理服务器以外的所有申请即可,增加如下配置。
# Whitelist
allow zzz.zzz.zzz.zzz; # 反向代理服务器的地址
deny all;
allow 关键字后跟的 ip 以外的申请会全副 deny 掉。
序幕
至此,全副实现的介绍结束。
参考:
https://caloskao.org/ubuntu-a…
https://www.cnblogs.com/kevin…
https://segmentfault.com/a/11…