前言

研究室最近调配了个工作,要求在研究室服务器上架设一个信息共享零碎,便于高年级生毕业后做信息引继,但有以下要求:

  1. 应用尽可能不便
  2. 因为是面向钻研室内的零碎,因而私密性须要保障

对于第一点,我思考了两个计划,第一种是延用今年的解决方案:应用开源软件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/*.loadIncludeOptional mods-enabled/*.conf# Include list of ports to listen onInclude 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_proxymod_proxy_http.somod_proxy_connect.so这三个模块。如果你是FreeBSD,你只须要在httpd.conf上把正文勾销掉,并重启服务后就能够了;但如果你应用的是Ubuntu,与sites-availablesites-enabled的应用办法雷同,mods-available是所有模块的存储目录,然而服务载入的模块是存储在mods-enabled的。

这一点通过apache.conf的以下几行能够证实:

# Include module configuration:IncludeOptional mods-enabled/*.loadIncludeOptional 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.confsudo 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)过滤除代理服务器以外的所有申请即可,增加如下配置。

# Whitelistallow zzz.zzz.zzz.zzz; # 反向代理服务器的地址deny all;

allow关键字后跟的ip以外的申请会全副deny掉。

序幕

至此,全副实现的介绍结束。

参考:
https://caloskao.org/ubuntu-a...
https://www.cnblogs.com/kevin...
https://segmentfault.com/a/11...