Home avatar

个人知识星球,专注于全栈开发和AI应用

聊聊Java中的几种I/O模型

同步、异步、阻塞、非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作。而在文件读取这件事儿上,可以有多种方式。

本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几种I/O模型,以及Java支持的I/O模型。

Nginx打印请求头和响应头

在Nginx调试问题的时候经常需要打印请求头和响应头信息,这里记录一下Nginx日志的配置方法。

编辑nginx.conf配置文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
http {
    log_format log_req_resp '$remote_addr - $remote_user [$time_local] ' '"$request" 
        $status $body_bytes_sent ' "$http_referer" "$http_user_agent"  
        $http_x_real_ip $http_x_forwarded_for $request_time $content_type 
        $host $http_authorization $http_x_sdk_date $http_x_sdk_content_sha256  
        '"$http_referer" "$http_user_agent" $request_time req_body:"$request_body"'  
        ' resp_body:"$resp_body" resp_header:"$resp_header"';
    log_format log_req_resp '$remote_addr | $http_x_real_ip | $http_x_forwarded_for ' 
        '"$request" $status' "$http_referer" "$http_user_agent"  $request_time 
        $content_type $host 'resp_header:"$resp_header"';
    server {
        access_log logs/access.log log_req_resp; 
        set $req_header "";
        set $resp_header "";
        header_filter_by_lua '
            local h = ngx.resp.get_headers()
            for k, v in pairs(h) do
                if type(v) == "table" then
                    for k, vv in pairs(v) do
                        ngx.var.resp_header = ngx.var.resp_header..k..": "..vv;
                    end
                else
                    ngx.var.resp_header = ngx.var.resp_header..k..": "..v;
                end
            end
        ';
        set $resp_body "";
        body_filter_by_lua '
          local resp_body = string.sub(ngx.arg[1], 1, 1000)
          ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
          if ngx.arg[2] then
             ngx.var.resp_body = ngx.ctx.buffered
          end
        ';
    }
}

注意:自定义响应头通过使用http_开头即可。

Nginx重新编译添加模块

一般的应用都是通过Nginx来做为反向代理,并且Nginx还可能是多层的。如果想在内部服务里面获取最原始的客户端IP地址。 则需要做一些配置。

最外层Nginx

为了防止X-Forwarded-For头的伪造,可在最外层Nginx将X-Forwarded-For设置为真实IP $remote_addr$remote_addr是获取的是直接TCP连接的客户端IP(类似于Java中的request.getRemoteAddr()), 这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。

Nginx重新编译添加模块

编译安装Nginx的时候,有些模块默认并不会安装,比如http_ssl_module,那么为了让Nginx支持HTTPS,必须添加这个模块。

下面讲解如何在已经安装过后再次添加新的模块。

1、找到安装nginx的源码根目录(即安装包存放目录),如果没有的话下载新的源码并解压

Nginx反向代理WebSocket

WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容, 它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的基础设施。

CentOS7搭建postfix邮件服务器

电子邮件系统是我们在日常工作、生活中最常用的一个网络服务。本章将首先介绍电子邮件系统的起源, 然后介绍SMTP、POP3、IMAP4等常见的电子邮件协议, 然后介绍如何在CentOS7中使用Postfix和Dovecot服务程序配置电子邮件系统服务的方法。 并结合BIND服务程序提供的DNS域名解析服务来验证客户端主机与服务器之间的邮件收发功能。