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-93841

JK Laiho's questions

Martin Hope
JK Laiho
Asked: 2023-01-31 05:24:53 +0800 CST

是什么导致单个 Apache2 工作程序(使用 mod_jk)数周未重新加载?

  • 5

我有一台运行 Apache2 2.4.38 的 Debian 10 服务器。最近,我替换了所有配置的 HTTPS 虚拟主机使用的 SSL 证书文件并运行systemctl reload apache2.service,它/usr/sbin/apachectl graceful通过 systemd 单元文件运行。

根据 Apache 2 文档,

USR1 或优雅信号导致父进程建议子进程在当前请求后退出(或者如果他们没有提供任何服务则立即退出)。父级重新读取其配置文件并重新打开其日志文件。当每个孩子死亡时,父母会用新一代配置中的孩子替换它,它会立即开始为新请求提供服务。

在繁忙的服务器上,替换子进程时发生延迟是可以理解的。然而,今天我注意到服务器很少会仍然使用旧的、替换前的 SSL 证书进行响应。我去看看流程:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     13559  0.0  0.2  15640 10356 ?        Ss    2022  18:53 /usr/sbin/apache2 -k start
www-data 16834  0.7  0.6 1232452 27780 ?       Sl   06:00   3:47 /usr/sbin/apache2 -k start
www-data 17415  0.9  0.6 1231844 26532 ?       Sl   10:22   2:32 /usr/sbin/apache2 -k start
www-data 17552  0.7  0.6 1231736 26376 ?       Sl   10:53   1:47 /usr/sbin/apache2 -k start
www-data 17612  0.6  0.6 1232000 26840 ?       Sl   10:54   1:34 /usr/sbin/apache2 -k start
www-data 17641  0.6  0.5 1231980 22732 ?       Sl   10:54   1:36 /usr/sbin/apache2 -k start
www-data 17642  0.8  0.6 1231848 24728 ?       Sl   10:54   1:59 /usr/sbin/apache2 -k start
www-data 26704  0.5  0.6 1232216 24748 ?       Sl   Jan18  89:53 /usr/sbin/apache2 -k start

START列表中的最后一个进程在和列上突出显示TIME。我在 1 月 24 日运行了重新加载命令,但现在,六天后,这个过程仍在进行。不过,服务器对请求的响应很好——不知道这名工作人员是否真的在处理新请求,但其他工作人员是。

服务器配置很简单,默认情况下不会包含在这里(现在 - 如果您需要任何特定信息,请询问)。唯一有趣的特性是它运行 mod_jk,即各种VirtualHost指令都有JkMount /* workername(workername定义在 /etc/libapache2-mod-jk/workers.properties 中)。mod_jk 用于ajp13连接到运行 Tomcat 的两个负载平衡应用程序服务器之一。

这不是我们第一次遇到 Apache2 worker 卡住的情况,但我一直无法确定它以这种方式结束的原因。这可能与 mod_jk 和(非常)遗留的 Java 应用程序有关,可能有一些请求在 Java/mod_jk 级别导致罕见的边缘情况错误,并阻止工作人员通过 USR1 退出信号。Java 应用程序日志不在我的控制之下;它们非常冗长,包含毫无意义的信息,通常缺少时间戳,并且对于故障排除几乎毫无用处,除非您恰好在错误发生的那一刻正在查看它们。

我将不得不进行非优雅重启,即使它会导致轻微的生产中断,但我对将来调试此问题的更多方法感兴趣,以便我们可以让工作人员始终可靠地执行优雅重启需要的时候。我们如何才能更好地分析是什么让工人陷入困境?


结果apachectl -V:

Server version: Apache/2.4.38 (Debian)
Server built:   2021-12-21T16:50:43
Server's Module Magic Number: 20120211:84
Server loaded:  APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

apachectl -S编辑了生产子域:

VirtualHost configuration:
*:443                  is a NameVirtualHost
         default server vhost1.domain.example (/etc/apache2/sites-enabled/00_vhost1.domain.example-ssl.conf:2)
         port 443 namevhost vhost1.domain.example (/etc/apache2/sites-enabled/00_vhost1.domain.example-ssl.conf:2)
         port 443 namevhost vhost2.domain.example (/etc/apache2/sites-enabled/01_vhost2.domain.example-ssl.conf:2)
         port 443 namevhost vhost3.domain.example (/etc/apache2/sites-enabled/02_vhost3.domain.example-ssl.conf:2)
         port 443 namevhost vhost4.domain.example (/etc/apache2/sites-enabled/03_vhost4.domain.example-ssl.conf:2)
                 alias alias1.domain.example
*:80                   is a NameVirtualHost
         default server vhost1.domain.example (/etc/apache2/sites-enabled/00_vhost1.domain.example.conf:1)
         port 80 namevhost vhost1.domain.example (/etc/apache2/sites-enabled/00_vhost1.domain.example.conf:1)
         port 80 namevhost vhost2.domain.example (/etc/apache2/sites-enabled/01_vhost2.domain.example.conf:1)
                 alias 172.16.33.63
         port 80 namevhost vhost3.domain.example (/etc/apache2/sites-enabled/02_vhost3.domain.example.conf:1)
         port 80 namevhost vhost4.domain.example (/etc/apache2/sites-enabled/03_vhost4.domain.example.conf:1)
                 alias alias1.domain.example
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex default: dir="/var/run/apache2/" mechanism=default 
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
apache-2.4
  • 1 个回答
  • 24 Views
Martin Hope
JK Laiho
Asked: 2021-10-27 04:51:18 +0800 CST

用于负载测试期间按需性能监控的轻量级 Linux 工具?

  • 0

我的任务是在几个 Tomcat 测试服务器上测试 ProxySQL,将其性能和资源利用率与当前的 Apache DBCP 连接池进行比较。我有一个粗略的负载测试计划,但我在监控和收集/比较系统级性能指标(CPU、内存、磁盘、网络等)方面的经验几乎为零

我的负载测试将涉及一个 Ansible 剧本,它执行各种准备任务,触发负载测试脚本,最后自行清理。我想添加“分别在负载测试之前和之后开始和停止收集性能指标”,但我不知道应该研究哪些工具。

在我看来,最佳解决方案如下所示:

  • 在 Tomcat 盒子的后台本地运行
  • 简单配置
  • 监控会话可以按需启动和停止
  • 高分辨率(如果需要,每秒收集一次甚至更频繁的指标)
  • 监控运行的结果很容易读入某种图形工具,用于比较不同的负载测试运行。

鉴于这些规格,我正在寻找什么样的选项,无论是监控任务本身还是用于检查它们的图形工具?

linux monitoring load-testing
  • 3 个回答
  • 79 Views
Martin Hope
JK Laiho
Asked: 2021-04-30 06:12:27 +0800 CST

Chrony 作为虚拟机上的 NTP 服务器的“最差”设置

  • 3

我的任务是重建一个 LAN 服务器,该服务器用作数百台客户端计算机的 NTP 服务器。不幸的是,它在虚拟机上,正如在虚拟机中运行 NTP 服务器的限制是什么之类的问题所证明的那样?这远非理想。

但是,在当前情况下,这是我必须使用的,直到依赖此服务器的数百台机器在未来某个地方被重新配置为更强大的 NTP 设置。

幸运的是,客户端不依赖毫秒精度。我一直计划在新服务器上运行 Chrony,将其配置为使用四个本地第 2 层服务器。

我是 NTP 服务的新手,也是 Chrony 的新手。对于这种情况,您认为哪些服务器端设置必不可少?考虑到首先在虚拟机上运行 NTP 服务器的基本限制,目标是最大限度地减少不准确性。

virtual-machines ntp chrony
  • 1 个回答
  • 867 Views
Martin Hope
JK Laiho
Asked: 2015-06-25 01:08:39 +0800 CST

iptables 在不应该阻止端口 80 和 443 上的一些流量时?

  • 3

我正在管理的 Web 服务器显示奇怪的 iptables 拒绝来自目标端口 443 上的 IPv4 地址,尽管明确允许 HTTPS 流量。同一规则中也允许使用端口 80,但该站点仅支持 HTTPS,并且 nginx 会立即将 80 重定向到 443。

事情是:浏览网站的作品。您可以加载所有页面,所有资源都很好等等。但是这里显然有些不对劲,这可能会损害页面加载性能。

/var/log/iptables_deny.log以下是分别针对端口 443 和 80登录的一些错误示例。tail -f根据我在日志文件中的判断,这些可以单独出现,也可以突然出现。绝大多数用于端口 443:

iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x08 PREC=0x00 TTL=53 ID=61266 DF PROTO=TCP SPT=49264 DPT=443 WINDOW=0 RES=0x00 RST URGP=0
iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x00 PREC=0x00 TTL=115 ID=11186 DF PROTO=TCP SPT=58445 DPT=443 WINDOW=254 RES=0x00 ACK FIN URGP=0
iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x00 PREC=0x00 TTL=116 ID=16941 DF PROTO=TCP SPT=16278 DPT=80 WINDOW=255 RES=0x00 ACK FIN URGP=0

快速 grepping 说拒绝中的数据包类型至少可以是 ACK、ACK FIN、ACK RST、ACK PSH 和 RST。也许是其他人,但他们没有引起我的注意。

下面是 iptables -nvL 的输出。基本模式(首先允许所有相关和建立,然后允许 80 和 443 上的所有新流量)根据我所阅读的所有内容应该是可靠的。LOG & DROP 规则是 INPUT 链中的最后一个,它们应该是。

Chain INPUT (policy ACCEPT 1 packets, 391 bytes)
 pkts bytes target     prot opt in     out     source          destination   
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0       0.0.0.0/0     
 8893  770K ACCEPT     all  --  *      *       0.0.0.0/0       0.0.0.0/0      ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       (redacted IP)   0.0.0.0/0      ctstate NEW tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       (redacted IP)   0.0.0.0/0      ctstate NEW tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       (redacted IP)   0.0.0.0/0      ctstate NEW tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       (redacted IP)   0.0.0.0/0      ctstate NEW tcp dpt:22
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0       0.0.0.0/0      icmptype 8
   63  3840 ACCEPT     tcp  --  *      *       0.0.0.0/0       0.0.0.0/0      ctstate NEW multiport dports 80,443
    0     0 DROP       udp  --  *      *       0.0.0.0/0       0.0.0.0/0      udp dpt:137
    0     0 DROP       udp  --  *      *       0.0.0.0/0       0.0.0.0/0      udp dpt:138
    0     0 DROP       udp  --  *      *       0.0.0.0/0       0.0.0.0/0      udp dpt:139
    0     0 DROP       udp  --  *      *       0.0.0.0/0       0.0.0.0/0      udp dpt:445
    1    40 LOG        all  --  *      *       0.0.0.0/0       0.0.0.0/0      limit: avg 15/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
    1    40 DROP       all  --  *      *       0.0.0.0/0       0.0.0.0/0     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source          destination   
    0     0 DROP       all  --  *      *       0.0.0.0/0       0.0.0.0/0     

Chain OUTPUT (policy ACCEPT 1 packets, 65 bytes)
 pkts bytes target     prot opt in     out     source          destination   
 7311   19M ACCEPT     all  --  *      *       0.0.0.0/0       0.0.0.0/0

实际的相关规则,如果它们在该输出之后有任何用处:

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT

很明显,总的来说,这不是恶意流量。我从几个不同的 IP 地址浏览了该站点,虽然该站点加载看起来不错,但我的 IP 也出现在拒绝日志中,没有任何我可以辨别的模式,并且浏览器中没有任何用户可见的错误情况。

任何想法这背后可能是什么?

iptables
  • 1 个回答
  • 1943 Views
Martin Hope
JK Laiho
Asked: 2015-02-18 13:40:53 +0800 CST

gunicorn 19.2 无法以 18.0 配置启动

  • 5

我有一个在 nginx 后面运行 gunicorn/Django 的开发服务器。作为更广泛的服务器环境更新的一部分,我尝试将 gunicorn 从 18.0 升级到 19.2.1,但该服务将不再启动。(服务器正在运行 Arch,因此使用 systemctl。)

gunicorn 配置是由不再由我们支配的人完成的,并且不太了解 gunicorn,我无法修复甚至定位问题,所以我恢复到版本 18.0,它现在可以工作。但是,我想最终对其进行升级,并将配置设置为可以正常工作的形状。我感觉当前的配置不是最理想的或多余的,但我无法确定:-)。

环境(或 gunicorn 运行的 virtualenv)没有任何变化,只有 gunicorn 本身被升级。Systemctl 产生了这个错误systemctl start gunicorn:

● gunicorn.service - gunicorn daemon (production)
   Loaded: loaded (/usr/lib/systemd/system/gunicorn.service; enabled)
   Active: failed (Result: resources) since Tue 2015-02-17 20:55:41 UTC; 8s ago
  Process: 2837 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
  Process: 9608 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 5353 ExecStart=/home/django/gunicorn/run.sh (code=exited, status=0/SUCCESS)
 Main PID: 24876 (code=exited, status=0/SUCCESS)

Feb 17 20:55:41 ashima systemd[1]: PID file /home/django/gunicorn/gunicorn.pid not readable (yet?) after start.
Feb 17 20:55:41 ashima systemd[1]: gunicorn.service never wrote its PID file. Failing.
Feb 17 20:55:41 ashima systemd[1]: Failed to start gunicorn daemon (production).
Feb 17 20:55:41 ashima systemd[1]: Unit gunicorn.service entered failed state.

尝试run.sh从 shell 手动运行包含在(粘贴在下面)中的 gunicorn 命令,它只是立即退出而没有产生任何错误,退出代码为 0。没有记录任何内容。事实上,看起来我的前任在日志文件增长到惊人的大小后不久就禁用了 gunicorn 日志记录,但这是另一天的问题。

以下是相关文件的内容:

/usr/lib/systemd/system/gunicorn.service:

[Unit]
Description=gunicorn daemon

[Service]
Type=forking
PIDFile=/home/django/gunicorn/gunicorn.pid
User=django
WorkingDirectory=/home/django/[name_withheld]/project
ExecStart=/home/django/gunicorn/run.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=false

[Install]
WantedBy=multi-user.target

/home/django/gunicorn/run.sh:

#!/bin/bash

set -e

cd /home/django/[name_withheld]/project
source /home/django/.venv/bin/activate
exec gunicorn -p /home/django/gunicorn/gunicorn.pid -c /home/django/gunicorn/config.py -e HTTPS=on [name_withheld]_site.wsgi:application

/home/django/gunicorn/config.py:

bind = 'unix:/tmp/gunicorn.sock'
backlog = 2048
workers = 16
worker_class = 'egg:gunicorn#sync'
worker_connections = 1000
timeout = 30
keepalive = 2
debug = False
spew = False
daemon = True
pidfile = None
umask = 0755
user = None
group = None
tmp_upload_dir = None
raw_env = 'HTTPS=on'
errorlog = '-'
loglevel = 'info'
accesslog = None
proc_name = None

def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")
arch-linux
  • 1 个回答
  • 1086 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