找回密码
 立即注册

QQ登录

只需一步,快速开始

willning
超级版主   /  发表于:2023-9-14 16:47  /   查看:3759  /  回复:0
本帖最后由 willning 于 2023-12-18 12:15 编辑

在经典的系统部署架构中,活字格服务管理器(安装在服务器上的服务,加载和运行使用设计器开发的应用)定位于应用服务器,在其上方通常是网关服务器,下方是数据库服务。如果入门了活字格,您大概已经了解了应用服务器和应用服务器的职责。网关服务器能帮咱们做些什么呢?希望通过本教程,您能够找到答案。


image.png709356689.png

在教程中,我们采用业界主流的网关服务器nginx为例,展示网关发挥作用的一些典型场景,如果你的项目也需要(大概率是需要的,即便现在你可能还没有意识到)实现以下这些场景,那就参考这个教程做起来吧。

  • 跨域访问:让多个应用共享同一个服务器的同一个端口
  • 静态资源:应对微信公众平台、域名拨测等文件验证
  • IP黑白名单:满足更高的安全防护要求
  • 访问日志:详细记录并分析系统响应能力


一、学习基础概念
在开始之前,如果您还没有听说过或者没有实操过nginx,没关系。nginx的入门课程多如牛毛,比如先花上半个小时,看一下B站上的这个入门课程:
【GeekHour】30分钟Nginx入门教程
或者看一下这篇教程:
这篇文章带你全面掌握 Nginx !

是不是很容易上手?弄清楚nginx的配置方法后,接下来,开始我们的活字格+nginx之旅!

二、跨域访问:让多个应用共享同一个服务器的同一个端口
将同一个系统的多个模块拆分成若干个应用,不论是开发管理还是系统运维都是很值得推荐的实践模式。但如果一个应用的前端页面需要调用另一个应用的服务端命令时,会遇到跨域访问的问题。为了解决这个问题,我们不得不将这些跨应用调用的功能全部挪到服务端命令中:A应用的前端页面调用A应用的服务端命令,在该服务端命令中调用B应用的WebAPI。这种做法平添了开发A应用服务端命令的工作量,后期维护时也会有额外的工作和风险。

image.png36133727.png

在编码开发时,我们通常是通过网关将所有应用统一到同一个地址和端口中,来避免这种跨域访问的问题。在活字格开发中,解决的方式也是一样的。

image.png877186584.png

我们在服务器上架设一台nginx服务器,将多个应用作为nginx的upstream。具体的配置方法如下:

1.1 修改nginx配置,在http节点下方为管理控制台和每个应用配置一个upstream节点,包含机器名和端口号。在我的测试环境中,nginx安装在应用服务器上,所以这里可以直接用localhost。常规情况下,nginx需要部署到和应用服务器在同一个局域网内的另外一台服务器上,此时,您需要将localhost替换为该服务器的内网IP。提示:为应用服务器添加upstream而不是直接在location中跳转,可以提升配置文件的可读性。

    upstream us-server{
        server localhost:22345;
    }

    upstream red-server{
        server localhost:9101;
    }

    upstream green-server{
        server localhost:9102;
    }

1.2 在http→server节点中监听80端口或其他指定的端口号
listen       80;

1.3 在http→server节点中,为管理控制台和每个应用分别配置一个location节点,包含URL的匹配规则和对应的upstream。最常用的规则是从头开始匹配,即^~意味着以后面的字符串开头,如location ^~ /red/匹配到的是所有以/red/开头的location(URL中端口号后面的部分)

特别提示:location的路径需要和应用名保持一致,如应用名是red,location的过滤器需要用^~ /red/

        location ^~ /UserService/ {
            proxy_pass http://us-server/UserService/;
            proxy_redirect default;      
        }

        location ^~ /red/ {
            proxy_pass http://red-server/red/;
            proxy_redirect default;
        }

        location ^~ /green/ {
            proxy_pass http://green-server/green/;
            proxy_redirect default;
        }   


1.4 在活字格管理控制台上,将应用的“域名”(应用管理→应用→常规设置→设置域名)修改为nginx监听的端口,确保页面的外部导航正常运行。应用的配置中,需要包含应用名。
image.png775431213.png
管理控制台的“域名”也需要设置(设置→安全设置→设置管理控制台站点的域名),控制台的配置不包含应用名
image.png456841430.png

扩展场景:
如果您的IT安全策略要求只能开放80/443端口,但需要访问到多个应用时,也可以用这个方案,实现端口统一化。

三、静态文件:通过微信公众平台等验证
在对接微信公众平台等第三方系统时,对方通常会提出基于文件的域名验证机制,如微信公众平台的JS接口域名验证需要将特定文件放到域名的根目录。
image.png926553649.png
此时,我们可以使用网关的静态资源服务器能力,完成验证工作。
image.png229372252.png
我们在【二、跨域访问】的基础上继续完善nginx配置。具体的操作方法如下:

2.1 在域名管理的界面上,将通过ICP备案的域名指向1.2中nginx服务器的外网地址。域名的申请、管理和备案不是本教程的关注点,您可以和域名供应商联系,寻求帮助

2.2 将需要对外提供访问的静态文件存放到nginx服务器上nginx静态资源根目录中,如/etc/nginx/html(安装方式和版本不同,根目录还可能是/usr/share/nginx/html或/var/www/html,默认情况下,nginx根目录中有index.html和50x.html两个文件)。nginx将根目录中的文件以Web静态资源的形式提供给外部使用。具体而言就是接收到URL为 /xxx.yyy 的请求时,将根目录中的xxx.yyy文件内容作为响应来返回。
1694589651588.png384633788.png

四、IP黑白名单:满足更高的安全防护要求
对于一些高安全要求的应用场景,通常会要求做黑白名单,如仅允许特定的IP访问、或不允许某个特定的IP访问。这些工作推荐在网关上执行,将风险拦截在应用服务器之外。

因为活字格内置的管理控制台中包含了应用管理、用户角色管理等敏感操作,很多企业要求为该应用启用白名单控制,仅允许公司IT运维团队专用的IP地址访问。接下来,我们在【二、跨域访问】的基础上继续完善nginx配置来实现白名单。具体的操作方法如下:

修改nginx配置中http→server节点中找到管理控制台对应的location,在下面追加以下内容,将内网的10.32.209.252和外网的113.132.178.118添加到白名单

        location ^~ /UserService/ {
            proxy_pass http://us-server/UserService/;
            proxy_redirect default;   
            allow 10.32.209.252;
            allow 113.132.178.118;
            deny all;  
        }


重要提示:
网关层面的白名单层次高于系统防火墙,两者不是取代关系。您依然需要使用防火墙的策略来避免暴露不必要的端口,以降低安全风险。

五、访问日志:详细记录并分析系统响应能力
当需要评估系统的响应性能、可用性等参数,寻找改进方向时,您需要通过第三方来记录应用的访问日志,然后将其接入主流的日志处理和分析工具链(日志分析是一个“高技术含量”的领域,已经有成熟的方案,如ELK)进行后续处理。
image.png942807922.png
好消息是,nginx内置了日志机制,您只需要做非常简单的配置,就可以得到想要的日志,然后再按照ELK的帮助文档,就能搞定自己的日志分析平台了。我们在【四、黑白名单】的基础上继续完善nginx配置来日志配置。具体的操作方法如下:

5.1 修改nginx配置中http节点,添加一个名为json的日志模板,便于filebeats抓取。建议您根据实际需求设置日志中包含的项目,项目越多,日志文件占用的磁盘空间就越大。比如,如果您需要关心应用服务器的响应速度和调用成功率,需要确保模板中包含$status和$upstream_response_time。

    log_format json escape=json '{"time_local": "$time_local", '
                          '"remote_addr": "$remote_addr", '
                          '"request_uri": "$request_uri", '
                          '"status": $status, '
                          '"upstream_time": "$upstream_response_time"}';

5.2 修改http→server节点,追加访问日志的配置,指定文件路径和刚才定义的名为json的模板
        access_log  /var/log/nginx/access.log json;

image.png238284911.png

常用的日志项目和参数如下所示:
image.png720505065.png
ELK端的配置和使用方法,可参考这篇入门教程:
https://zhuanlan.zhihu.com/p/163846770


本方案中用到的配置文件如附件,采用了最简单的配置方式,其中worker_processes和worker_connections与资源占用和性能相关,请根据机器配置情况调整。
nginx.conf (1.98 KB, 下载次数: 501)

评分

参与人数 6满意度 +30 收起 理由
阮贵全 + 5
leilei6120 + 5
真难想 + 5
lxf_007222 + 5
amtath + 5
gczxxu + 5

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部