Nginx反代Artifactory、Jenkins问题记录

发布于 2023年12月28日

问题1:

在使用Artifactory过程中,用户下载1G或者一分钟就会自动断开
原因:
proxy_max_temp_file_size参数默认是1G,Nginx timeout时间为一分钟,当客户端网络比较慢时,临时文件很快就被写满,这时候后端的响应还会继续被接收到socket缓冲区,直至缓冲区被打满。此时Nginx所在服务器通过滑动窗口Zere 0告知后端服务器停止发送数据,直至触发了后端的write超时。
解决:
修改nginx配置文件:/etc/nginx/nginx.conf添加以下参数:
proxy_max_temp_file_size 0; #0为无限制

问题2:

使用Jenkins过程中,登录Jenkins正常,但是退出后就会报错:502 Bad Gateway
原因:代理缓冲区设置过小
解决:
修改nginx配置文件:/etc/nginx/nginx.conf
添加:

# 设置缓冲区大小为128KB,用于存储从后端服务器接收到的响应数据
proxy_buffer_size 128k;
# 指定缓冲区的数量和大小,用于存储大量的响应数据
proxy_buffers 8 64k;
# 设置nginx在繁忙状态下使用的缓冲区大小,用于存储繁忙时的响应数据
proxy_busy_buffers_size 256k;
# 设置临时文件的写入缓冲区大小,用于存储从后端服务器接收到的大文件数据
proxy_temp_file_write_size 128k;

问题3:

使用nginx反代了Artifactory后,并且也配置了base url为https://example/artifactory
但是访问域名只会跳转到https://example/artifactory 并且无法访问。
解决办法:
nginx使用下面的配置

server {
	listen 80;
	server_name artifactory.example.com;
	return 301 https://$host$request_uri;
}
server {
	listen 443 ssl;
	server_name jfrog.ooo.run;
	ssl_certificate /etc/nginx/ssl/jfrog/jfrog.ooo.run.crt;
	ssl_certificate_key /etc/nginx/ssl/jfrog/jfrog.ooo.run.key;
    #当请求的URI为/时,将其重写为/artifactory/webapp/,并发起重定向
	rewrite ^/$ /artifactory/webapp/ redirect;
	rewrite ^/artifactory/?(/webapp)?$ /artifactory/webapp/ redirect;
	chunked_transfer_encoding on;
    #设置允许客户端发送的请求体最大大小为0,表示不限制请求体大小,客户端上传最大的文件不限制,这通常用于允许上传大文件。
	client_max_body_size 0;
    #如果 X-Forwarded-Proto 为空,那么通过 set 指令将其设置为与请求的协议相同的值(http或https)
	if ($http_x_forwarded_proto = '') {
		set $http_x_forwarded_proto  $scheme;
	}
	location / {
	    proxy_read_timeout 900;
	    proxy_pass_header Server;
	    proxy_cookie_path ~*^/.* /;
	    if ( $request_uri ~ ^/artifactory/(.*)$ ) {
	    	proxy_pass http://10.0.0.2:8084/artifactory/$1;
	    }
	    proxy_pass http://10.0.0.5:8084/artifactory/;
        # 将目标服务器的端口号放入HTTP请求头的X-Forwarded-Port字段
	    proxy_set_header X-Forwarded-Port $server_port;
        # 将请求的协议(HTTP或HTTPS)放入HTTP请求头的X-Forwarded-Proto字段
	    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        # 将原始请求的域名放入HTTP请求头的Host字段
	    proxy_set_header Host $http_host;
        # 将客户端的真实IP地址放入HTTP请求头的X-Forwarded-For字
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

使用官方的这一段配置。

问题4:

jenkins 使用websocket(Jenkins slave连接Jenkins)连接时,提示 io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error
解决方法:
需要给 nginx 配置加了转发 websocket 的相关头信息
vim /etc/nginx/conf.d/default.conf

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

/**
map指令的作用:
该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade,
创建的规则就是{}里面的东西。其中的规则没有做匹配,因此使用默认的,即 $connection_upgrade 的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话,
那值会是 close。
*/

server {
        。。。。。。。。。。
        location / {
                proxy_read_timeout 300s;
                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_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
       }
}

这里最重要的是最后三行,重启nginx后,一切都正常工作了。

问题5:

nginx反代tcp端口,在 Nginx 配置文件中,http 块和 stream 块是两种不同的块类型,它们分别用于处理 HTTP 和 TCP/UDP 流量。http块用于配置 HTTP 服务器,包括监听端口、虚拟主机、反向代理、负载均衡、缓存等功能。stream 块用于配置 TCP/UDP 服务器,包括监听端口、负载均衡、代理等功能。
/etc/nginx/conf.d 目录是包含在 http 块中的,所以TCP负载均衡不能再配置在 /etc/nginx/conf.d 目录下的配置文件中了,需要和在 nginx.conf 中配置,并且和 http 块同级。

在/etc/nginx/nginx.conf配置文件中配置

http {
  ...
}

stream {
  upstream tcp/ssh-port {
    server localhost:29418;
  }
  server {
    listen 50000;
    proxy_pass tcp/ssh-port;
  }
}