[+] Apache2, d

Konfiguracja serwerów, usług, itp.
pokiegogrzyba
Posty: 6
Rejestracja: 01 października 2012, 12:55

[+] Apache2, długo ładująca się strona

Post autor: pokiegogrzyba »

Od paru tygodni nurtuje mnie dosyć ciekawy przypadek, długo ładującej się strony https na moim serwerze apache2. Mianowicie, po przekroczeniu parametru ,,KeepAliveTimeout'' ustawionego na 15 bardzo długo ładuje się strona (,,page speed'' pokazuje mi parametr oczekiwania około 5 sekund).

Gdy wartość limitu czasu utrzymania aktywności (ang. keep alive time out) trzyma sesję ładowanie strony to kwestia ułamka sekund. Przeglądałem różne fora w celu rozwiązania problemu, ale nie natrafiłem zbytnio na odpowiedź. Zapytania DNS wykluczam, wyłączyłem także wszelkie javascripty i bez efektu. Optymalizację strony pomijam (myślę, że nie tu leży problem). Jedynie manipulowanie parametrem wartości limitu czasu utrzymania aktywności strony powoduje jakiekolwiek zmiany, ale z powodu bezpieczeństwa nie ustawię tego przecież na więcej (mogę tym sposobem zarżnąć serwer). Może mam jakąś błędną konfigurację, przestarzałe moduły?

Pytanie kieruje do osób, które spotkały się z podobnym problem lub mogą mi pomóc w rozwiązaniu problemu.

Z góry serdecznie dziękuję za poświęcony czas.

Moja konfiguracja:

Kod: Zaznacz cały

php -vPHP 5.3.3-7+squeeze14 with Suhosin-Patch (cli) (built: Aug  6 2012 14:18:06)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

Kod: Zaznacz cały

Linux Debian 6.0.6 2.6.32-5-amd64 

Kod: Zaznacz cały

Apache/2.2.16 (Debian)
Wersja klienta MySQL: 5.1.63
Ustawiania Apache2:

Kod: Zaznacz cały

ServerRoot "/etc/apache2"

LockFile /var/lock/apache2/accept.lock

# Timeout: The number of seconds before receives and sends time out.

Timeout 300
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.

MaxKeepAliveRequests 200


# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#domyślnie 15
KeepAliveTimeout 15

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>


# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

DefaultType text/plain

HostnameLookups Off

ErrorLog /var/log/apache2/error.log
LogLevel warn

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf


# Include ports listing
Include /etc/apache2/ports.conf

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# Define an access log for VirtualHosts that don't define their own logfile
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

KeepAlive On
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

Czekanie przed pustym ekranem nudzi odwiedzających. Ilość danych koniecznych do wyświetlenia każdej strony nie powinna przekraczać 100KB–200KB. Chodzi o HTML, arkusz stylów, skrypty i grafiki konieczne do poprawnego wyglądu, żeby można było zacząć czytać stronę. Ilustracje i opcjonalne bajery, które mogą załadować się później, mogą być znacznie większe.

Na prędkość ładowania i pierwszego wyświetlenia strony wpływa nie tylko jej objętość, ale także ilość plików (zażądanie każdego pliku daje dodatkowe opóźnienie), a nawet kolejność ich użycia w dokumencie (np. skrypty blokują ładowanie innych plików). Yahoo! zajęło się analizą tego problemu i stworzyło rozszerzenie dla Firefoksa, które ocenia architekturę strony pod tym kątem oraz najlepszy kompresor skryptów.

Jeśli generujesz długie strony przez PHP możesz je przesyłać skompresowane. W tym celu dodaj na początku <?php ob_start("ob_gzhandler"); ?>. Można kompresować wszystko na serwerze przez mod_gzip lub mod_deflate Apache/Lighttpd.

Dobrze kompresuj także grafikę. Używaj progresywnych JPG lub zoptymalizowanych PNG gdzie się tylko da. Photoshop generuje niepotrzebnie duże pliki, możesz je odchudzić za pomocą Jpegoptim.
Całość:
http://pornel.net/bledy#sec100
pokiegogrzyba
Posty: 6
Rejestracja: 01 października 2012, 12:55

Post autor: pokiegogrzyba »

Dziękuję za odnośnik. Ale powiedzmy, że na tym etapie wykluczam wydajność kodu (chyba, że zmiana interpretera php w ostatnim czasie znacząco na to wpłynęła). Wiem, że nawet jak na spory portal:

Kod: Zaznacz cały

The page has a total of 102 components and a total weight of 413.1K bytes
to może być za dużo, ale to co mnie interesuje, znajduje się w ustawieniach serwera apache. Jakieś bardziej sprawne oko dostrzega może tam rażące błędy? I dlaczego tak bardzo wpływa na to ang. keep alive time out oraz czy może być tu jeszcze problem z programem suhosin?
Awatar użytkownika
Yampress
Administrator
Posty: 6422
Rejestracja: 09 sierpnia 2007, 21:41
Lokalizacja: PL

Post autor: Yampress »

  1. Jakie moduły masz załadowane przez serwer apache?
  2. Suchosin zła konfiguracja też może być.
pokiegogrzyba
Posty: 6
Rejestracja: 01 października 2012, 12:55

Post autor: pokiegogrzyba »

Kod: Zaznacz cały

Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 expires_module (shared)
 headers_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 perl_module (shared)
 php5_module (shared)
 python_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 ssl_module (shared)
 status_module (shared)

Kod: Zaznacz cały

Max Requests 	Per Child: 0 - Keep Alive: on - Max Per Connection: 200
Timeouts 	Connection: 300 - Keep-Alive: 15
Jak już wspomniałem, jeśli minie czas Keep-Alive, strona zamiast 0,3 sekundy ładuje się ~5 sekund.
Awatar użytkownika
Yampress
Administrator
Posty: 6422
Rejestracja: 09 sierpnia 2007, 21:41
Lokalizacja: PL

Post autor: Yampress »

To nie moduły apache, to było w php extensions. Pamiętam 1 rozszerzenie też miałem załadowane i ono właśnie zwalniało mi apache.
pokiegogrzyba
Posty: 6
Rejestracja: 01 października 2012, 12:55

Post autor: pokiegogrzyba »

masz na myśli:

Kod: Zaznacz cały

dpkg -l | grep php
ii  libapache2-mod-php5                 5.3.3-7+squeeze14      server-side, HTML-embedded scripting language (Apache 2 module)
ii  php5                                5.3.3-7+squeeze14            server-side, HTML-embedded scripting language (metapackage)
ii  php5-cli                            5.3.3-7+squeeze14            command-line interpreter for the php5 scripting language
ii  php5-common                         5.3.3-7+squeeze14            Common files for packages built from the php5 source
ii  php5-gd                             5.3.3-7+squeeze14            GD module for php5
ii  php5-mcrypt                         5.3.3-7+squeeze14            MCrypt module for php5
ii  php5-mysql                          5.3.3-7+squeeze14            MySQL module for php5
ii  php5-suhosin                        0.9.32.1-1                   advanced protection module for php5
ii  phpmyadmin                          4:3.3.7-7                    MySQL web administration tool
?

Jeśli nie, to możesz rozwinąć trochę temat?
Awatar użytkownika
Yampress
Administrator
Posty: 6422
Rejestracja: 09 sierpnia 2007, 21:41
Lokalizacja: PL

Post autor: Yampress »

Nie, to żaden z tych modułów. Trzeba było go skonfigurować, a że mi sie nie chciało szukać. Wyłączyłem go i już wszystko było w porządku.
Odpowiadał za optymalizacje php, z tego co pamiętam. apc to był moduł.
The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.
A w logach ,,apache error'' co jest?
Na początek wyłącz suhosin. Jeśli to będzie przyczyną musisz zmienić jego konfiguracje.
Awatar użytkownika
lun
Beginner
Posty: 266
Rejestracja: 01 lutego 2010, 22:06
Lokalizacja: Warszawa

Post autor: lun »

Rozumiem Twoje przekonanie odnośnie optymalizacji kodu, ale mimo wszystko spróbowałbym na Twoim miejscu uruchomić stronę na jakimś alternatywnym serwerze WWW (lighttpd, nginx). Wtedy definitywnie wykluczysz tą opcję i będzie wiadomo, że zostaje apache.
pokiegogrzyba
Posty: 6
Rejestracja: 01 października 2012, 12:55

Post autor: pokiegogrzyba »

Znalazłem przyczynę. Okazało się, że Apache był dobrze skonfigurowany, moduły nie miały wpływu na wydajność, tak samo optymalizacja kodu jak i również wyłączenie lub włączenie suhosina.
Przyczyną był .htaccess (że też od razu nie dobrałem się do niego). Poniżej prezentuję jego ustawienia.

Kod: Zaznacz cały

AuthName "portal"
AuthType Basic
order deny,allow
deny from all
#Odkomentuj jeśli nie chcesz korzystać z suhosina
#php_flag suhosin.simulation On
#hp_flag magic_quotes_gpc Off

allow from xxx.xxx.xxx.xxx # Mój adres ip z sieci lokalnej - strona działa szybko
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx # Jeśli tu trafiłem strona zaczyna ładować się wolno
...
allow from 192.168.X. # Tu się zaczyna dostęp z kilku vlanów
allow from 192.168.X.
allow from 192.168.X.
allow from 192.168.X.
allow from 192.168.X.
allow from 192.168.X.
...

allow from xxx.xxx.xxx.xxx - Tu zaczyna się dostęp z paru adresów ip zew.
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
...
# cachowanie plików
# -----------------
# Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0

# Set up caching on media files for 1 year (forever?)
<filesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A29030400
Header append Cache-Control "public"
</filesMatch>

# Set up caching on media files for 1 week
<filesMatch "\.(gif|jpg|jpeg|png|swf)$">
ExpiresDefault A604800
Header append Cache-Control "public"
</filesMatch>


# Set up 2 Hour caching on commonly updated files
<filesMatch "\.(xml|txt|html|js|css)$">
ExpiresDefault A7200
Header append Cache-Control "proxy-revalidate"
</filesMatch>

# Force no caching for dynamic files
<filesMatch "\.(php|cgi|pl|htm)$">
ExpiresActive Off
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</filesMatch>


Plik został wprowadzony ze względu na wprowadzenie ograniczenia vlanów do portalu i wszystkich adresów za wyjątkiem (stąd powyższe wpisy). Jeśli było się na stosie allow from odpowiednio wysoko strona hulała aż miło (~0,6s), jeśli tylko zmieniłem np. kolejność, czyli dopisałem się odpowiednio nisko. Strona ładuje się ponad 5s. Znacie ten problem? wynika to z zbyt dużej ilości wpisów, obliczeń, przelatuje to na zasadzie stosu? Generalnie dla mnie to błąd niespotykany. Wcześniej .htaccess również posiadał dużo wpisów i przy starszych interpreterach php działało.
Warto to może wyjaśnić, jeśli ktoś posiada taką wiedzę. Może się przyda :)
ODPOWIEDZ