├── README.md ├── httpd-server-status.conf.sample ├── userparameter_zapache.conf.sample ├── zapache ├── zapache-template-active.xml └── zapache-template.xml /README.md: -------------------------------------------------------------------------------- 1 | # zapache 1.5 - Apache monitoring script for Zabbix 2 | 3 | The script version 1.4 and template are taken from https://www.zabbix.com/wiki/templates/apache#method_3 4 | 5 | ## What's new 6 | 7 | ### Version 1.5 8 | 9 | * Zapache would cache received apache status page for 60 seconds by default. This eliminates the need to query apache for every item collected. 10 | * Added worker threads graph to a template 11 | * Added new items: status, ping, BusyWorkers, CPULoad 12 | * Added trigger for Apache status to a template 13 | * Ability to specify status page URL as a parameter to the script 14 | * Better error handling 15 | * Added sample conf files for Apache and Zabbix agent 16 | * Added measurement units to a template 17 | * Requires Zabbix version 2.0 and later. 18 | 19 | ## Installation 20 | 21 | ### CentOS 6.4/Zabbix 2.0 from EPEL repo 22 | 23 | #### On the apache server: 24 | 25 | ##### Install files 26 | sudo install -o root -g root -m 0755 zapache /var/lib/zabbixsrv/externalscripts/zapache 27 | sudo install -d /etc/zabbix_agentd.conf.d 28 | echo "Include=/etc/zabbix_agentd.conf.d/" | sudo tee -a /etc/zabbix_agentd.conf 29 | sudo install -o root -g root -m 0644 userparameter_zapache.conf.sample /etc/zabbix_agentd.conf.d/userparameter_zapache.conf 30 | sudo install -o root -g root -m 0644 httpd-server-status.conf.sample /etc/httpd/conf.d/httpd-server-status.conf 31 | ##### Restart 32 | sudo service httpd restart 33 | sudo service zabbix-agent restart 34 | ##### Check if it's working 35 | sudo -u zabbix /var/lib/zabbixsrv/externalscripts/zapache Uptime 36 | sudo -u zabbix zabbix_agentd -p | grep ^zapache 37 | sudo -u zabbix zabbix_get -s localhost -k zapache[Uptime] 38 | 39 | #### On Zabbix server 40 | 41 | Now import zapache-template.xml and zapache-template-active.xml on Zabbix server and bind "Template App Apache Web Server zapache" OR "Template App Apache Web Server zapache Agent Active" template to Apache host. 42 | -------------------------------------------------------------------------------- /httpd-server-status.conf.sample: -------------------------------------------------------------------------------- 1 | # 2 | # This is a sample Apache config file to setup status page. 3 | # Put it in /etc/httpd/conf.d/ or otherwise integrate with Apache conf. 4 | # 5 | 6 | # 7 | # ExtendedStatus controls whether Apache will generate "full" status 8 | # information (ExtendedStatus On) or just basic information (ExtendedStatus 9 | # Off) when the "server-status" handler is called. The default is Off. 10 | # 11 | ExtendedStatus On 12 | 13 | # 14 | # Allow server status reports generated by mod_status, 15 | # with the URL of http://servername/server-status 16 | # Change the ".example.com" to match your domain to enable. 17 | # 18 | 19 | SetHandler server-status 20 | Order deny,allow 21 | Deny from all 22 | Allow from localhost 23 | 24 | -------------------------------------------------------------------------------- /userparameter_zapache.conf.sample: -------------------------------------------------------------------------------- 1 | # 2 | # This is a sample zabbix_agentd config file. 3 | # Put it to /etc/zabbix_agentd.conf.d or otherwise integrate into agent config. 4 | # Edit to your needs. 5 | # 6 | UserParameter=zapache[*],/var/lib/zabbixsrv/externalscripts/zapache \$1 7 | -------------------------------------------------------------------------------- /zapache: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | # 3 | # Name: zapache 4 | # 5 | # Checks Apache activity. 6 | # 7 | # Author: Alejandro Michavila 8 | # Modified for Scoreboard Values: Murat Koc, murat@profelis.com.tr 9 | # Modified for using also as external script: Murat Koc, murat@profelis.com.tr 10 | # Modified for outputting usage or ZBX_NOTSUPPORTED: Alejandro Michavila 11 | # Modified to do cacheing for performance, dmitry.frolov@gmail.com 12 | # 13 | # Version: 1.5 14 | # 15 | 16 | zapachever="1.5" 17 | rval=0 18 | value="" 19 | cache_seconds="60" 20 | [ "$TMPDIR" ] || TMPDIR=/tmp 21 | 22 | function usage() 23 | { 24 | echo "zapache version: $zapachever" 25 | echo "usage:" 26 | echo " $0 [] TotalAccesses - Check total accesses." 27 | echo " $0 [] TotalKBytes - Check total KBytes." 28 | echo " $0 [] CPULoad - Check CPU load." 29 | echo " $0 [] Uptime - Check uptime." 30 | echo " $0 [] ReqPerSec - Check requests per second." 31 | echo " $0 [] BytesPerSec - Check Bytes per second." 32 | echo " $0 [] BytesPerReq - Check Bytes per request." 33 | echo " $0 [] BusyWorkers - Check busy workers." 34 | echo " $0 [] IdleWorkers - Check idle workers." 35 | echo " $0 [] version - Version of this script." 36 | echo " $0 [] ping - Check if Apache is up." 37 | echo " $0 [] WaitingForConnection - Check Waiting for Connection processess." 38 | echo " $0 [] StartingUp - Check Starting Up processess." 39 | echo " $0 [] ReadingRequest - Check Reading Request processess." 40 | echo " $0 [] SendingReply - Check Sending Reply processess." 41 | echo " $0 [] KeepAlive - Check KeepAlive Processess." 42 | echo " $0 [] DNSLookup - Check DNSLookup Processess." 43 | echo " $0 [] ClosingConnection - Check Closing Connection Processess." 44 | echo " $0 [] Logging - Check Logging Processess." 45 | echo " $0 [] GracefullyFinishing - Check Gracefully Finishing Processess." 46 | echo " $0 [] IdleCleanupOfWorker - Check Idle Cleanup of Worker Processess." 47 | echo " $0 [] OpenSlotWithNoCurrentProcess - Check Open Slots with No Current Process." 48 | } 49 | 50 | ######## 51 | # Main # 52 | ######## 53 | 54 | if [[ $# == 1 ]];then 55 | #Agent Mode 56 | STATUS_URL="http://localhost/server-status?auto" 57 | CASE_VALUE="$1" 58 | elif [[ $# == 2 ]];then 59 | #External Script Mode 60 | STATUS_URL="$1" 61 | case "$STATUS_URL" in 62 | http://*|https://*) ;; 63 | *) STATUS_URL="http://$STATUS_URL/server-status?auto";; 64 | esac 65 | CASE_VALUE="$2" 66 | else 67 | #No Parameter 68 | usage 69 | exit 0 70 | fi 71 | 72 | case "$CASE_VALUE" in 73 | 'version') 74 | echo "$zapachever" 75 | exit 0;; 76 | esac 77 | 78 | umask 077 79 | 80 | # $UID is bash-specific 81 | cache_prefix="zapache-$UID-${STATUS_URL//[^a-zA-Z0-9_-]/_}" 82 | cache="$TMPDIR/$cache_prefix.cache" 83 | cache_timestamp_check="$TMPDIR/$cache_prefix.ts" 84 | # This assumes touch from coreutils 85 | touch -d "@$((`date +%s` - ($cache_seconds - 1)))" "$cache_timestamp_check" 86 | 87 | if [ "$cache" -ot "$cache_timestamp_check" ]; then 88 | curl="`which curl`" 89 | if [ "$curl" ]; then 90 | fetch_url() { $curl --insecure --silent --location -H "Cache-Control: no-cache" "$@"; } 91 | else 92 | wget="`which wget`" 93 | if [ "$wget" ]; then 94 | fetch_url() { $wget --no-check-certificate --quiet --header "Cache-Control: no-cache" -O - "$@"; } 95 | else 96 | echo "ZBX_NOTSUPPORTED" 97 | exit 1 98 | fi 99 | fi 100 | 101 | fetch_url "$STATUS_URL" > "$cache" 102 | rval=$? 103 | if [ $rval != 0 ]; then 104 | echo "ZBX_NOTSUPPORTED" 105 | exit 1 106 | fi 107 | fi 108 | 109 | case "$CASE_VALUE" in 110 | 'ping') 111 | if [ ! -s "$cache" -o "$cache" -ot "$cache_timestamp_check" ]; then 112 | echo "0" 113 | else 114 | echo "1" 115 | fi 116 | exit 0;; 117 | esac 118 | 119 | if ! [ -s "$cache" ]; then 120 | echo "ZBX_NOTSUPPORTED" 121 | exit 1 122 | fi 123 | 124 | case "$CASE_VALUE" in 125 | 'TotalAccesses') 126 | value="`awk '/^Total Accesses:/ {print $3}' < \"$cache\"`" 127 | rval=$?;; 128 | 'TotalKBytes') 129 | value="`awk '/^Total kBytes:/ {print $3}' < \"$cache\"`" 130 | rval=$?;; 131 | 'CPULoad') 132 | value="`awk '/^CPULoad:/ {print $2}' < \"$cache\"`" 133 | rval=$?;; 134 | 'Uptime') 135 | value="`awk '/^Uptime:/ {print $2}' < \"$cache\"`" 136 | rval=$?;; 137 | 'ReqPerSec') 138 | value="`awk '/^ReqPerSec:/ {print $2}' < \"$cache\"`" 139 | rval=$?;; 140 | 'BytesPerSec') 141 | value="`awk '/^BytesPerSec:/ {print $2}' < \"$cache\"`" 142 | rval=$?;; 143 | 'BytesPerReq') 144 | value="`awk '/^BytesPerReq:/ {print $2}' < \"$cache\"`" 145 | rval=$?;; 146 | 'BusyWorkers') 147 | value="`awk '/^BusyWorkers:/ {print $2}' < \"$cache\"`" 148 | rval=$?;; 149 | 'IdleWorkers') 150 | value="`awk '/^IdleWorkers:/ {print $2}' < \"$cache\"`" 151 | rval=$?;; 152 | 'WaitingForConnection') 153 | value="`awk '/^Scoreboard:/ {print split($2,notused,"_")-1}' < \"$cache\"`" 154 | rval=$?;; 155 | 'StartingUp') 156 | value="`awk '/^Scoreboard:/ {print split($2,notused,"S")-1}' < \"$cache\"`" 157 | rval=$?;; 158 | 'ReadingRequest') 159 | value="`awk '/^Scoreboard:/ {print split($2,notused,"R")-1}' < \"$cache\"`" 160 | rval=$?;; 161 | 'SendingReply') 162 | value="`awk '/^Scoreboard:/ {print split($2,notused,"W")-1}' < \"$cache\"`" 163 | rval=$?;; 164 | 'KeepAlive') 165 | value="`awk '/^Scoreboard:/ {print split($2,notused,"K")-1}' < \"$cache\"`" 166 | rval=$?;; 167 | 'DNSLookup') 168 | value="`awk '/^Scoreboard:/ {print split($2,notused,"D")-1}' < \"$cache\"`" 169 | rval=$?;; 170 | 'ClosingConnection') 171 | value="`awk '/^Scoreboard:/ {print split($2,notused,"C")-1}' < \"$cache\"`" 172 | rval=$?;; 173 | 'Logging') 174 | value="`awk '/^Scoreboard:/ {print split($2,notused,"L")-1}' < \"$cache\"`" 175 | rval=$?;; 176 | 'GracefullyFinishing') 177 | value="`awk '/^Scoreboard:/ {print split($2,notused,"G")-1}' < \"$cache\"`" 178 | rval=$?;; 179 | 'IdleCleanupOfWorker') 180 | value="`awk '/^Scoreboard:/ {print split($2,notused,"I")-1}' < \"$cache\"`" 181 | rval=$?;; 182 | 'OpenSlotWithNoCurrentProcess') 183 | value="`awk '/^Scoreboard:/ {print split($2,notused,".")-1}' < \"$cache\"`" 184 | rval=$?;; 185 | *) 186 | usage 187 | exit 1;; 188 | esac 189 | 190 | if [ "$rval" -eq 0 -a -z "$value" ]; then 191 | case "$CASE_VALUE" in 192 | # Theese metrics are output only if non-zero 193 | 'CPULoad' | 'ReqPerSec' | 'BytesPerSec' | 'BytesPerReq') 194 | value=0 195 | ;; 196 | *) 197 | rval=1 198 | ;; 199 | esac 200 | fi 201 | 202 | if [ "$rval" -ne 0 ]; then 203 | echo "ZBX_NOTSUPPORTED" 204 | fi 205 | 206 | echo "$value" 207 | exit $rval 208 | 209 | # 210 | # end zapache 211 | -------------------------------------------------------------------------------- /zapache-template-active.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2.0 4 | 2014-10-08T05:14:32Z 5 | 6 | 7 | Templates 8 | 9 | 10 | 11 | 999 | 1000 | 1001 | 1002 | {Template App Apache Web Server zapache Agent Active:zapache[ping].last(0)}=0 1003 | Apache down on {HOST.NAME} 1004 | 1005 | 0 1006 | 4 1007 | 1008 | 0 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | Apache Bytes Per Request 1015 | 900 1016 | 200 1017 | 0.0000 1018 | 100.0000 1019 | 1 1020 | 1 1021 | 0 1022 | 1 1023 | 0 1024 | 0.0000 1025 | 0.0000 1026 | 1 1027 | 0 1028 | 0 1029 | 0 1030 | 1031 | 1032 | 0 1033 | 0 1034 | 00C800 1035 | 0 1036 | 2 1037 | 0 1038 | 1039 | Template App Apache Web Server zapache Agent Active 1040 | zapache[BytesPerReqRealtime] 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | Apache Bytes Per Second 1047 | 900 1048 | 200 1049 | 0.0000 1050 | 100.0000 1051 | 1 1052 | 1 1053 | 0 1054 | 1 1055 | 0 1056 | 0.0000 1057 | 0.0000 1058 | 1 1059 | 0 1060 | 0 1061 | 0 1062 | 1063 | 1064 | 0 1065 | 0 1066 | 00C800 1067 | 0 1068 | 7 1069 | 0 1070 | 1071 | Template App Apache Web Server zapache Agent Active 1072 | zapache[TotalKBytes] 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | Apache CPU Load 1079 | 900 1080 | 200 1081 | 0.0000 1082 | 100.0000 1083 | 1 1084 | 1 1085 | 0 1086 | 1 1087 | 0 1088 | 0.0000 1089 | 0.0000 1090 | 1 1091 | 0 1092 | 0 1093 | 0 1094 | 1095 | 1096 | 0 1097 | 0 1098 | 00C800 1099 | 0 1100 | 2 1101 | 0 1102 | 1103 | Template App Apache Web Server zapache Agent Active 1104 | zapache[CPULoad] 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | Apache Requests Per Second 1111 | 900 1112 | 200 1113 | 0.0000 1114 | 100.0000 1115 | 1 1116 | 1 1117 | 0 1118 | 1 1119 | 0 1120 | 0.0000 1121 | 0.0000 1122 | 1 1123 | 0 1124 | 0 1125 | 0 1126 | 1127 | 1128 | 0 1129 | 0 1130 | 00C800 1131 | 0 1132 | 2 1133 | 0 1134 | 1135 | Template App Apache Web Server zapache Agent Active 1136 | zapache[TotalAccesses] 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | Apache Thread Scoreboard 1143 | 900 1144 | 200 1145 | 0.0000 1146 | 100.0000 1147 | 0 1148 | 0 1149 | 1 1150 | 1 1151 | 0 1152 | 0.0000 1153 | 0.0000 1154 | 0 1155 | 0 1156 | 0 1157 | 0 1158 | 1159 | 1160 | 1 1161 | 1 1162 | 00EE00 1163 | 0 1164 | 2 1165 | 0 1166 | 1167 | Template App Apache Web Server zapache Agent Active 1168 | zapache[SendingReply] 1169 | 1170 | 1171 | 1172 | 6 1173 | 1 1174 | FF9999 1175 | 0 1176 | 2 1177 | 0 1178 | 1179 | Template App Apache Web Server zapache Agent Active 1180 | zapache[ReadingRequest] 1181 | 1182 | 1183 | 1184 | 2 1185 | 1 1186 | 0000EE 1187 | 0 1188 | 2 1189 | 0 1190 | 1191 | Template App Apache Web Server zapache Agent Active 1192 | zapache[StartingUp] 1193 | 1194 | 1195 | 1196 | 0 1197 | 1 1198 | 009900 1199 | 0 1200 | 2 1201 | 0 1202 | 1203 | Template App Apache Web Server zapache Agent Active 1204 | zapache[WaitingForConnection] 1205 | 1206 | 1207 | 1208 | 7 1209 | 1 1210 | 00DDDD 1211 | 0 1212 | 2 1213 | 0 1214 | 1215 | Template App Apache Web Server zapache Agent Active 1216 | zapache[KeepAlive] 1217 | 1218 | 1219 | 1220 | 3 1221 | 1 1222 | 888888 1223 | 0 1224 | 2 1225 | 0 1226 | 1227 | Template App Apache Web Server zapache Agent Active 1228 | zapache[DNSLookup] 1229 | 1230 | 1231 | 1232 | 9 1233 | 1 1234 | CC3232 1235 | 0 1236 | 2 1237 | 0 1238 | 1239 | Template App Apache Web Server zapache Agent Active 1240 | zapache[Logging] 1241 | 1242 | 1243 | 1244 | 4 1245 | 1 1246 | BB00BB 1247 | 0 1248 | 2 1249 | 0 1250 | 1251 | Template App Apache Web Server zapache Agent Active 1252 | zapache[GracefullyFinishing] 1253 | 1254 | 1255 | 1256 | 5 1257 | 1 1258 | 000000 1259 | 0 1260 | 2 1261 | 0 1262 | 1263 | Template App Apache Web Server zapache Agent Active 1264 | zapache[IdleCleanupOfWorker] 1265 | 1266 | 1267 | 1268 | 8 1269 | 1 1270 | 777700 1271 | 0 1272 | 2 1273 | 0 1274 | 1275 | Template App Apache Web Server zapache Agent Active 1276 | zapache[ClosingConnection] 1277 | 1278 | 1279 | 1280 | 10 1281 | 0 1282 | 960096 1283 | 0 1284 | 2 1285 | 0 1286 | 1287 | Template App Apache Web Server zapache Agent Active 1288 | zapache[OpenSlotWithNoCurrentProcess] 1289 | 1290 | 1291 | 1292 | 1293 | 1294 | 1295 | -------------------------------------------------------------------------------- /zapache-template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2.0 4 | 2014-10-08T05:14:32Z 5 | 6 | 7 | Templates 8 | 9 | 10 | 11 | 999 | 1000 | 1001 | 1002 | {Template App Apache Web Server zapache:zapache[ping].last(0)}=0 1003 | Apache down on {HOST.NAME} 1004 | 1005 | 0 1006 | 4 1007 | 1008 | 0 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | Apache Bytes Per Request 1015 | 900 1016 | 200 1017 | 0.0000 1018 | 100.0000 1019 | 1 1020 | 1 1021 | 0 1022 | 1 1023 | 0 1024 | 0.0000 1025 | 0.0000 1026 | 1 1027 | 0 1028 | 0 1029 | 0 1030 | 1031 | 1032 | 0 1033 | 0 1034 | 00C800 1035 | 0 1036 | 2 1037 | 0 1038 | 1039 | Template App Apache Web Server zapache 1040 | zapache[BytesPerReqRealtime] 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | Apache Bytes Per Second 1047 | 900 1048 | 200 1049 | 0.0000 1050 | 100.0000 1051 | 1 1052 | 1 1053 | 0 1054 | 1 1055 | 0 1056 | 0.0000 1057 | 0.0000 1058 | 1 1059 | 0 1060 | 0 1061 | 0 1062 | 1063 | 1064 | 0 1065 | 0 1066 | 00C800 1067 | 0 1068 | 7 1069 | 0 1070 | 1071 | Template App Apache Web Server zapache 1072 | zapache[TotalKBytes] 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | Apache CPU Load 1079 | 900 1080 | 200 1081 | 0.0000 1082 | 100.0000 1083 | 1 1084 | 1 1085 | 0 1086 | 1 1087 | 0 1088 | 0.0000 1089 | 0.0000 1090 | 1 1091 | 0 1092 | 0 1093 | 0 1094 | 1095 | 1096 | 0 1097 | 0 1098 | 00C800 1099 | 0 1100 | 2 1101 | 0 1102 | 1103 | Template App Apache Web Server zapache 1104 | zapache[CPULoad] 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | Apache Requests Per Second 1111 | 900 1112 | 200 1113 | 0.0000 1114 | 100.0000 1115 | 1 1116 | 1 1117 | 0 1118 | 1 1119 | 0 1120 | 0.0000 1121 | 0.0000 1122 | 1 1123 | 0 1124 | 0 1125 | 0 1126 | 1127 | 1128 | 0 1129 | 0 1130 | 00C800 1131 | 0 1132 | 2 1133 | 0 1134 | 1135 | Template App Apache Web Server zapache 1136 | zapache[TotalAccesses] 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | Apache Thread Scoreboard 1143 | 900 1144 | 200 1145 | 0.0000 1146 | 100.0000 1147 | 0 1148 | 0 1149 | 1 1150 | 1 1151 | 0 1152 | 0.0000 1153 | 0.0000 1154 | 0 1155 | 0 1156 | 0 1157 | 0 1158 | 1159 | 1160 | 1 1161 | 1 1162 | 00EE00 1163 | 0 1164 | 2 1165 | 0 1166 | 1167 | Template App Apache Web Server zapache 1168 | zapache[SendingReply] 1169 | 1170 | 1171 | 1172 | 6 1173 | 1 1174 | FF9999 1175 | 0 1176 | 2 1177 | 0 1178 | 1179 | Template App Apache Web Server zapache 1180 | zapache[ReadingRequest] 1181 | 1182 | 1183 | 1184 | 2 1185 | 1 1186 | 0000EE 1187 | 0 1188 | 2 1189 | 0 1190 | 1191 | Template App Apache Web Server zapache 1192 | zapache[StartingUp] 1193 | 1194 | 1195 | 1196 | 0 1197 | 1 1198 | 009900 1199 | 0 1200 | 2 1201 | 0 1202 | 1203 | Template App Apache Web Server zapache 1204 | zapache[WaitingForConnection] 1205 | 1206 | 1207 | 1208 | 7 1209 | 1 1210 | 00DDDD 1211 | 0 1212 | 2 1213 | 0 1214 | 1215 | Template App Apache Web Server zapache 1216 | zapache[KeepAlive] 1217 | 1218 | 1219 | 1220 | 3 1221 | 1 1222 | 888888 1223 | 0 1224 | 2 1225 | 0 1226 | 1227 | Template App Apache Web Server zapache 1228 | zapache[DNSLookup] 1229 | 1230 | 1231 | 1232 | 9 1233 | 1 1234 | CC3232 1235 | 0 1236 | 2 1237 | 0 1238 | 1239 | Template App Apache Web Server zapache 1240 | zapache[Logging] 1241 | 1242 | 1243 | 1244 | 4 1245 | 1 1246 | BB00BB 1247 | 0 1248 | 2 1249 | 0 1250 | 1251 | Template App Apache Web Server zapache 1252 | zapache[GracefullyFinishing] 1253 | 1254 | 1255 | 1256 | 5 1257 | 1 1258 | 000000 1259 | 0 1260 | 2 1261 | 0 1262 | 1263 | Template App Apache Web Server zapache 1264 | zapache[IdleCleanupOfWorker] 1265 | 1266 | 1267 | 1268 | 8 1269 | 1 1270 | 777700 1271 | 0 1272 | 2 1273 | 0 1274 | 1275 | Template App Apache Web Server zapache 1276 | zapache[ClosingConnection] 1277 | 1278 | 1279 | 1280 | 10 1281 | 0 1282 | 960096 1283 | 0 1284 | 2 1285 | 0 1286 | 1287 | Template App Apache Web Server zapache 1288 | zapache[OpenSlotWithNoCurrentProcess] 1289 | 1290 | 1291 | 1292 | 1293 | 1294 | 1295 | --------------------------------------------------------------------------------