关于linux:ApacheNginx构建仅对团队内部公开使用的web应用

33次阅读

共计 4209 个字符,预计需要花费 11 分钟才能阅读完成。

前言

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

  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/*.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_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/*.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…

正文完
 0