跳转至
For the complete DHIS2 documentation index, see llms.txt.

Reverse Proxy

反向代理配置

反向代理是代表服务器运行的代理服务器。使用 反向代理与Servlet容器结合使用是可选的,但 有很多优点:

  • 可以将请求映射并传递到多个servlet容器。 这提高了灵活性,并使其更易于运行 同一台服务器上的DHIS2实例。这也使得 在不影响客户端的情况下更改内部服务器设置。

  • DHIS2应用程序可以作为非root用户在端口上运行 不同于80,这减少了会话的后果 劫持。

  • 反向代理可以充当单个SSL服务器并进行配置 检查恶意内容请求,日志请求和 响应并提供不敏感的错误消息,这将 提高安全性。

基本的Nginx设置

由于以下原因,我们建议使用[nginx](http://www.nginx.org)作为反向代理 其低内存占用和易用性。要安装,请调用 以下:

sudo apt-get install -y nginx

现在可以使用以下命令启动,重新加载和停止nginx 命令:

sudo /etc/init.d/nginx开始
须藤/etc/init.d/nginx重新加载
sudo /etc/init.d/nginx停止

现在我们已经安装了 nginx,接下来将继续配置 将请求定期代理到 Tomcat 实例。 运行在 http://localhost:8080。要配置 nginx,可以通过调用 配置文件:

须藤nano /etc/nginx/nginx.conf

nginx配置围绕代表以下内容的块层次结构构建 http,服务器和位置,其中每个块都从父级继承设置 块。以下代码段将nginx配置为通过代理 (重定向)来自端口80的请求(该端口是nginx监听的端口 默认情况下)到我们的Tomcat实例。包括以下配置 在nginx.conf中:

http {
  gzip on; # Enables compression, incl Web API content-types
  gzip_types
    "application/json;charset=utf-8" application/json
    "application/javascript;charset=utf-8" application/javascript text/javascript
    "application/xml;charset=utf-8" application/xml text/xml
    "text/css;charset=utf-8" text/css
    "text/plain;charset=utf-8" text/plain;

  server {
    listen               80;
    client_max_body_size 10M;

    # Proxy pass to servlet container

    location / {
      proxy_pass                http://localhost:8080/;
      proxy_redirect            off;
      proxy_set_header          Host               $host;
      proxy_set_header          X-Real-IP          $remote_addr;
      proxy_set_header          X-Forwarded-For    $proxy_add_x_forwarded_for;
      proxy_set_header          X-Forwarded-Proto  http;
      proxy_buffer_size         128k;
      proxy_buffers             8 128k;
      proxy_busy_buffers_size   256k;
      proxy_cookie_path         ~*^/(.*) "/$1; SameSite=Lax";
    }
  }
}

现在,您可以通过* http:// localhost 访问DHIS2实例。自从 已经设置了反向代理,我们可以通过使Tomcat来提高安全性 只监听本地连接。在 / conf / server.xml 中,您可以添加一个 连接器元素的 address 属性值为 localhost * 对于HTTP 1.1像这样:

<Connector address="localhost" protocol="HTTP/1.1" />

使用nginx {#install_enabling_ssl_on_nginx}启用SSL

为了提高安全性,建议配置服务器 运行DHIS2以通过加密连接与客户端进行通信 并使用受信任的证书向客户端标识自己。这个可以 通过SSL(一种加密通信协议)来实现 在TCP / IP上运行。首先,安装所需的* openssl *库:

sudo apt-get install -y openssl

要配置nginx使用SSL,你需要从SSL提供商处获得适当的SSL证书。 证书。证书费用因加密强度不同而有很大差异。 取决于加密强度。Rapid SSL Online](http://www.rapidsslonline.com)提供的经济实惠的证书应该能满足大多数需求。要 生成 CSR(证书签名请求),你可以调用下面的 命令。当系统提示你输入*通用名称*时,请输入你的网站的 您要保护的网站的完全合格域名。 确保安全。

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

收到证书文件(.pem或.crt)后,您将 需要将其与生成的server.key文件放在一起 nginx可以到达的位置。一个好的位置可以是 与您的nginx.conf文件所在的目录相同。

下面是一个nginx 服务器块,其中的证书文件名为 server.crt 和 server.key。由于 SSL 连接通常发生在端口 443 (HTTPS),我们会将该端口 (443) 上的请求传递给运行在``上的 DHIS2 实例。 上运行。第一个服务器块将重写 所有连接到 80 端口的请求,并强制使用 HTTPS/SSL。这 这也是必要的,因为 DHIS2 在内部使用了大量的重定向 这些重定向必须传递给 HTTPS。切记将 \<server-ip> 替换为服务器的 IP。这些块应替换 上一节中的内容。

``文本 http { gzip on; # 启用压缩,包括 Web API 内容类型 gzip_types "application/json;charset=utf-8" 应用程序/json "application/javascript;charset=utf-8" application/javascript text/javascript "application/xml;charset=utf-8" 应用程序/xml 文本/xml "text/css;charset=utf-8" text/css "text/plain;charset=utf-8" text/plain;

# HTTP 服务器 - 重写以强制使用 SSL

服务器 { listen 80; rewrite ^ https://$request_uri? permanent; }

# HTTPS 服务器

server { listen 443 ssl; client_max_body_size 10M;

ssl_certificate server.crt;
ssl_certificate_key server.key;

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 代理传递给 servlet 容器

位置 / {
  proxy_pass http://localhost:8080/;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto https;
  proxy_buffer_size 128k;
  proxy_buffers 8 128k;
  proxy_busy_buffers_size 256k;
  proxy_cookie_path ~*^/(.*) "/$1; SameSite=Lax";
}

} } 请注意最后一个`https`标头值,该值是通知 servlet容器,该请求通过HTTPS发出。为了 Tomcat还需要使用HTTPS正确生成`Location` URL头 在Tomcat`server.xml`文件中向连接器添加其他两个参数:xml ```

使用Nginx启用缓存

要求提供报告,图表,地图和其他与分析相关的资源 通常会花费一些时间来响应,并且可能会占用大量服务器 资源。为了缩短响应时间,请减少 服务器并隐藏潜在的服务器停机时间,我们可以引入缓存代理 在我们的服务器设置中。缓存的内容将存储在目录中 / var / cache / nginx,最多将分配250 MB的存储空间。 Nginx的 将自动创建此目录。

http {
  ..
  proxy_cache_path  /var/cache/nginx  levels=1:2  keys_zone=dhis:250m  inactive=1d;


  server {
    ..

    # Proxy pass to servlet container and potentially cache response

    location / {
      proxy_pass                http://localhost:8080/;
      proxy_redirect            off;
      proxy_set_header          Host               $host;
      proxy_set_header          X-Real-IP          $remote_addr;
      proxy_set_header          X-Forwarded-For    $proxy_add_x_forwarded_for;
      proxy_set_header          X-Forwarded-Proto  https;
      proxy_buffer_size         128k;
      proxy_buffers             8 128k;
      proxy_busy_buffers_size   256k;
      proxy_cookie_path         ~*^/(.*) "/$1; SameSite=Lax";
      proxy_cache               dhis;
    }
  }
}

重要

请注意,服务器端缓存会缩短DHIS2安全性 从某种意义上说是功能,这些请求命中了服务器端缓存 将直接从DHIS2控制范围之外的缓存中提供 和servlet容器。这意味着请求URL可以是 猜测并由未经授权的用户从缓存中检索报告。 因此,如果您捕获敏感信息,请设置服务器端 不建议使用缓存。

使用Nginx进行速率限制

DHIS 2中的某些Web API调用,如analytics API,是计算密集型的。因此,最好对这些API进行速率限制,以允许系统的所有用户充分利用服务器资源。速率限制可以通过nginx实现。有多种实现速率限制的方法,这旨在记录基于nginx的方法。

下面的 nginx 配置将对 analyticsWeb API 进行速率限制,并在 httplocation 块级别包含以下元素(为简洁起见,对配置进行了缩写):

http {
  ..
  limit_req_zone $binary_remote_addr zone=limit_analytics:10m rate=5r/s;

  server {
    ..

    location ~ ^/api/(\d+/)?analytics(.*)$ {
      limit_req    zone=limit_analytics burst=20;
      proxy_pass   http://localhost:8080/api/$1analytics$2$is_args$args;
      ..
    }
  }
}

配置的各个元素可以描述为:

    • limit_req_zone $ binary_remote_addr *:速率限制是针对每个请求IP进行的。
    • zone = limit_analytics:20m *:Analytics API的速率限制区域,最多可容纳10 MB的请求IP地址。
    • rate = 20r / s *:每个IP每秒被授予5个请求。
  • location ~ ^/api/(\d+/)?analytics(.*)$:对分析 API 端点的请求有速率限制。
  • burst=20:最多 20 个请求的突发将排队等候,并在稍后时间提供服务;更多请求将导致503

有关完整说明,请查阅[nginx文档](https://www.nginx.com/blog/rate-limiting-nginx/)。

使用Nginx使资源可用

在某些情况下,希望公开发布某些资源 无需身份验证即可在Web上使用。一个例子是 当您想在Web API中进行与数据分析相关的资源时 在Web门户中可用。以下示例将允许访问 基本的图表,地图,报告,报告表和文档资源 通过将* Authorization * HTTP标头注入 请求。它将从请求中删除Cookie标头, 从响应中获取Set-Cookie标头,以避免更改 当前登录的用户。建议为此创建一个用户 目的仅给出所需的最低权限。授权 值可以通过Base64编码,并在用户名后附加一个 冒号和密码,并以“ Basic”作为前缀,更准确地说是“ Basic” base64 _encode(username:password)“。它将检查使用的HTTP方法 用于请求并返回* 405方法不允许*(如果不是GET,则为其他方法) 检测到。

为此类公共用户设置一个单独的域可能是有利的 使用这种方法时。这是因为我们不想更改 已登录用户访问公共帐户时的凭据 资源。例如,当您的服务器部署在somedomain.com上时, 您可以在api.somedomain.com上设置专用的子域,并指向URL 从您的门户到此子域。

http {
  ..

  server {
    listen       80;
    server_name  api.somedomain.com;

    location ~ ^/(api/(charts|chartValues|reports|reportTables|documents|maps|organisationUnits)|dhis-web-commons/javascripts|images|dhis-web-commons-ajax-json|dhis-web-mapping|dhis-web-visualizer) {
    if ($request_method != GET) {
        return 405;
      }

      proxy_pass         http://localhost:8080;
      proxy_redirect     off;
      proxy_set_header   Host               $host;
      proxy_set_header   X-Real-IP          $remote_addr;
      proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto  http;
      proxy_set_header   Authorization      "Basic YWRtaW46ZGlzdHJpY3Q=";
      proxy_set_header   Cookie             "";
      proxy_hide_header  Set-Cookie;
    }
  }
}

使用nginx{ #install_block_android_versions } 阻止特定的安卓应用项目版本

在某些情况下,系统管理员可能希望根据其 DHIS2 应用项目版本阻止某些 Android 客户端。例如,如果现场用户尚未将他们的 Android App 版本更新到特定版本,并且系统管理员想要阻止他们的访问以强制更新;或者完全相反的情况,当系统管理员想要阻止尚未测试的新版本的应用项目时。这可以通过使用 nginx 配置文件中的特定 User-Agent 规则轻松实现。

http {

  server {
    listen       80;
    server_name  api.somedomain.com;

    # Block the latest Android App as it has not been tested
    if ( $http_user_agent ~ 'com\.dhis2/1\.2\.1/2\.2\.1/' ) {
        return 403;
    }

    # Block Android 4.4 (API is 19) as all users should have received new tablets
    if ( $http_user_agent ~ 'com\.dhis2/.*/.*/Android_19' ) {
        return 403;
    }
  }
}

Note For the implementation of the method described above note the following: * Before version 1.1.0 the User-Agent string was not being sent. * From version 1.1.0 to 1.3.2 the User-Agent followed the pattern Dhis2/AppVersion/AppVersion/Android_XX * From version 2.0.0 and above the User-Agent follows the pattern com.dhis2/SdkVersion/AppVersion/Android_XX * Android_XX refers to the Android API level i.e. the Android version as listed here. * nginx uses PCRE for Regular Expression matching .