AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-77501

Nanne's questions

Martin Hope
Nanne
Asked: 2013-07-16 01:42:01 +0800 CST

使用 nginx 负载平衡服务器重复 POST 请求(状态 499)

  • 10

双重上传

自从我们从一个简单的 Apache 实例转变为负载均衡环境后,有时会出现重复 POST 请求的问题。我们将 nginx 作为反向代理运行。静态内容由 nginx 本身提供,动态内容由两个 Apache 后端提供。

我检查过它不是界面/用户错误。一个小例子:一个简单的图像上传将导致图像被上传两次。请求/POST 不会通过双击或用户失败发送两次。我没有发现任何证据表明浏览器发送了两次请求,所以我怀疑是在服务器端。(请注意,这只是怀疑。)这些请求大部分是内部的,这意味着它们来自员工,所以我可以验证它们是如何产生的。

我能找到的唯一“错误”是 nginx499在这些情况下会记录错误。但是,我不确定这是问题的原因还是(副作用)。(我知道 499 不是默认的 http 状态,它是 nginx 状态,意思是“客户端已关闭连接”)

要求

重复的 POST 请求几乎是所有可能需要一段时间的请求。我在这里展示的一个例子是一个简单的图像上传,但脚本在后台做了一些事情(图像必须转换成不同的格式/大小,并且应该分发到两个服务器等)。

日志

一个例子是上传图片。nginx 将记录一个“499”和一个 200 请求,但 Apache 正在接收(并处理!)两个请求。

阿帕奇

[17:17:37 +0200] "POST ***URL** HTTP/1. 0" 200 9045   
[17:17:47 +0200] "POST ***URL** HTTP/1. 0" 200 20687

nginx

[17:17:47 +0200] "POST ***URL** HTTP/1.1" 499 0 
[17:17:52 +0200] "POST ***URL** HTTP/1.1" 200 5641

怀疑

在我看来,更大/更慢的上传更受此影响,所以我怀疑超时。我试图阅读 499 错误:结论似乎是“客户端关闭连接”。这可能是后台的情况,但我不确定这意味着应该发出第二个请求,并且肯定不会发生“用户关闭浏览器”之类的事情。

目前,它似乎有助于分解较慢的 POST 请求(如果有很多事情要做,只需让用户选择 1 并为另一个选择第二次 POST),但这可能只是降低了它发生的机会。没有把握。

这显然是一个临时解决方案。如果是超时,我需要找出在哪里并增加相应的数字,但我不确定为什么超时会导致这种行为:我怀疑是“嗯,出错了”消息,而不是重复。

问题

我正在寻找哪些过程/情况会导致重复发布 POST。当然,任何“不确定为什么,但可以通过增加此超时时间来解决”也很好。

nginx 配置

NGINX.conf

user  nginx;
worker_processes  2;
worker_rlimit_nofile 10240;

error_log  /var/log/nginx/error.log error;
pid        /var/run/nginx.pid;


events {
    multi_accept on;
    worker_connections  4096;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nodelay     off;    
    client_max_body_size    30m;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

conf.d

我已经删除了geo部件中的一些特定于 IP 的行以及SSL变体,以保持简单。如果需要,我可以替换它们,但归结geo为 ssl 后端以及相应的上游和 conf 文件的额外部分。

geo $backend {
    default apache-backend;
}

upstream apache-backend {
    ip_hash;
    server SERVER1 max_fails=3 fail_timeout=30s weight=2;
    server SERVER2 max_fails=3 fail_timeout=30s weight=3;
}

conf.d/somestring.conf

limit_conn_zone $binary_remote_addr zone=somestring:10m;
server {
    listen ip1:80;
    listen ip2:80;
    server_name name.tld www.name.tld;

    root PATH

    access_log PATH/name.log main;

    location / {
            proxy_pass              http://$backend;
    }

            //*some more locations**//

    gzip on;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}

conf.d/proxy.conf

proxy_set_header        Accept-Encoding "";
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Host $http_host;

proxy_buffering         on;
proxy_read_timeout      90;
proxy_buffer_size       32k;
proxy_buffers           8 32k;
proxy_busy_buffers_size    32k;
proxy_temp_file_write_size 32k;
apache-2.2
  • 2 个回答
  • 16869 Views
Martin Hope
Nanne
Asked: 2013-04-10 06:55:30 +0800 CST

mod_reqtimeout 如何计算数据速率?

  • 0

reqtimeout模块有一个最小数据速率的设置,正文看起来(包括默认注释)如下所示:

# Wait max 10 seconds for the first byte of the request body (if any)
# From then, require a minimum data rate of 500 bytes/s
RequestReadTimeout body=10,minrate=500

这个数据率是如何计算的?例如,如果客户遇到小问题,客户有多少宽大处理?例如,当做一个有点大的请求(比如发布文件?)时,我可以想象虽然总体速度会比那快得多,但在某个时候可能有一个原因是不满足速率。它是每秒测量的吗?或者某种移动窗口?

apache-2.2
  • 1 个回答
  • 338 Views
Martin Hope
Nanne
Asked: 2012-07-18 00:15:55 +0800 CST

带有 cURL 的 NTLM 返回 401

  • 5

目标:连接到 Exchange 服务器 (EWS)
方法:cURL
问题:无法获得身份验证 (NTLM),请求返回401。1

似乎有一个古老的、有据可查的2问题,它始于 cURL 从 OpenSSL 到 NSS 的迁移。我读到 NTLM 的实现依赖于 OpenSSL,因此此举破坏了 NTLM 身份验证。

问题如下所示,但重要的部分似乎是返回401的,gss_init_sec_context()下面是。

我不明白的是我当前的版本:

  • 根据https://launchpad.net/ubuntu/+source/curl/7.22.0-3ubuntu4有一个 OpenSSL 变体
  • 根据同一链接支持 NTLM
  • 根据下面的日志(它说)实际上使用了这个变体(而不是 NSS libcurl/7.22.0 OpenSSL)
  • 根据以上几点,不应受到链接错误的困扰。
  • 但受到影响,正如我得到 401 的事实所示

我不确定如何解决这个问题。我可以找到很多关于这个问题的旧的(主要是 2010 年的)参考,但没有新的,当然也没有解决方案。我知道提供的参考资料(参见2)表明这可能适用于旧版本 (7.19),但我不能(也不愿意)降级到该版本。

Exchange-communication (EWS) 的几种实现使用 cURL 来检索 EWS 文件(wsdl 等),所以我确信一定有一个可行的方法,但我找不到它。有谁知道我能做什么?我是否还有另一个错误,我是否错误地解释了事实,这是否仍然与链接中提供的情况相同并且永远不会修复?


1错误是这样的:

curl https://*DOMAIN*/Exchange.asmx -w %{http_code} --ntlm -u *USERNAME* --verbose --show-error
Enter host password for user '*USERNAME':
* About to connect() to DOMAIN port 443 (#0)
*   Trying IP... connected
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES128-SHA
* Server certificate:
     *SNIP*
*        SSL certificate verify ok.
* Server auth using NTLM with user 'USERNAME'
> GET /EWS/Exchange.asmx HTTP/1.1
> Authorization: NTLM *snip*
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: DOMAIN
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Server: Microsoft-IIS/7.5
< Set-Cookie: exchangecookie=xxx; expires=Wed, 17-Jul-2013 07:45:30 GMT; path=/; HttpOnly
< WWW-Authenticate: NTLM  *SNIP*
* gss_init_sec_context() failed: : Credentials cache file '/tmp/krb5cc_1005' not foundWWW-Authenticate: Negotiate
< X-Powered-By: ASP.NET
< Date: Tue, 17 Jul 2012 07:45:30 GMT
< Content-Length: 0
<
* Connection #0 to host DOMAIN left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

2例如:

  • https://bugs.launchpad.net/ubuntu/+source/curl/+bug/675974
  • https://bugzilla.redhat.com/show_bug.cgi?id=603783
  • https://stackoverflow.com/questions/4341368/curl-always-returns-401-with-ntlm
    • 这是同一个问题,但没有解决我的libcurlNSS中不应该出现该问题的事实。OpenSSL

卷曲信息:

user@server:~$ curl -V
curl 7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
linux exchange exchange-2010 curl ntlm
  • 2 个回答
  • 13122 Views
Martin Hope
Nanne
Asked: 2012-06-12 02:16:37 +0800 CST

memcached 中意外的(?)高“浪费”内存

  • 18

已更新,请参阅较长(抱歉)问题的底部。

查看我们的 memcached 统计数据,我想我发现了一个我以前没有意识到的问题。似乎我们有大量浪费的空间。我检查了phpmemcacheadmin是否有更改,发现这张图片正盯着我看:

memcached 缓存大小图形

现在我的印象是最坏的情况是有 50% 的浪费,尽管我是第一个承认不知道所有细节的人。我已经阅读过 - 除其他外 -这个页面确实有点旧,但我们的 memcached 版本也是如此。我想我确实理解系统是如何工作的(例如)我相信,但我很难理解我们如何达到 76% 的空间浪费。

phpmemcacheadmin 显示的驱逐率是2 ev/s,所以这里有一些问题。

  • 主要问题是:我能做些什么来解决这个问题。我可以给它更多的内存(我认为有一些额外的可用内存),也许我应该摆弄 slab 配置(这个版本甚至可能吗?),也许还有其他选择?升级 memcached 版本不是一个快速可用的选项。

  • 出于好奇,第二个问题当然是是否预计 75%(并且还在上升)的空间浪费率是预期的,如果是,为什么。

系统:目前我无能为力,我知道memcached版本不是最新的,但这些是我发过的牌。

  • 内存缓存 1.4.5
  • 阿帕奇 2.2.17
  • PHP 5.3.5

作为对@DavidSchwartz 回答的回应:这里是 phpmemcacheadmin 生成的平板统计数据:(顺便说一句,还有更多的平板)

(我还在这里以文本格式粘贴了稍后的统计数据)

平板细节

更新

我用 -f 1.5 重新启动了守护进程,它看起来非常好。经过一些变暖后,我们使用/浪费了 50 / 50。但是,和以前一样,我们一天的时间越长(白天变得越忙),它开始回落到目前的水平:30 / 70,并且浪费仍在上升。除此之外,我仍然不知道“浪费”是从哪里来的。我看到这个平板:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

它没有满,没有被逐出,但它浪费了 117.3 兆字节。我所做的快速计算(如果我错了请纠正我)是:

  • 前一个 slab 的块大小为 328,所以最坏的情况是这个 slab 填充了 329 字节的块。
  • 这意味着每个使用的块浪费 167 字节 = 12942834 字节 = 12.3 MB

那么其他105 MB 的浪费是从哪里来的呢?旁边的大哥长这样:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109
memcached
  • 3 个回答
  • 8443 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve