Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Debian + Nginx + PHP5 + MySQL - prosta instalacja

Przygotowanie systemu

Gdy już mamy w systemie aktualna listę dostępnych pakietów, warto by nasz system zaktualizować, więc:

root@linux:~# apt-get upgrade

Robiąc strony internetowe dobrze jest mieć lokalnie serwer www na komputerze. Opiszę tutaj szybka instalacja Nginx-a wraz z MySQL oraz PHP5.

Na początek instalujemy dodatkowe pakiety wg. Uznania. W moim przypadku są to mc, screen, vim i kilka innych przydatnych programów

root@linux:~# apt-get install vim-nox screen mc curl htop bind9utils

Akceptujemy informacje instalatora.

4 upgraded, 90 newly installed, 0 to remove and 17 not upgraded. Need to get 59.6MB of archives. After this operation, 166MB of additional disk space will be used. Do you want to continue [Y/n]?

Warto przekonfigurować domyślnego shella.

root@linux:~# dpkg-reconfigure dash Use dash as the default system shell (/bin/sh)? <-- No

Instalujemy bazę danych.

root@linux:~# apt-get install mysql-client mysql-server opensslPodczas konfiguracji pakietu MySQL Server, kreator zapyta nas jakie chcemy mieć domyślne hasło do serwera.

Jeżeli serwer bazy danych mamy na innej maszynie można zmienić adres na jakim ma nasłuchiwać. Domyślnie jest to localhost. Wiec musimy dokonać zmiany w pliku /etc/mysql/my.cnf. Szukamy odpowiedniej linii i ją komentujemy lub zmieniamy localhost na IP naszej maszyny.

root@linux:~# vi /etc/mysql/my.cnf #bind-address = 127.0.0.1

Wykonujemy restart i sprawdzamy jak nasłuchuje serwer MySQL.

/etc/init.d/mysql restart netstat -tap | grep mysql root@linux:~# netstat -tap | grep mysql tcp 0 0 *:mysql *:* LISTEN 10617/mysqld

Jak widać serwer nasłuchuje na wszystkich adresach i kartach sieciowych naszej maszyny.

Czas na serwer webowy oraz PHP

apt-get install nginx apt-get install php5-cgi spawn-fcgi php5-gd php-pear php5 php5-common php5-gd php5-mysql php5-imap php5-curl php5-pgsql php5-cli php5-mcrypt mcrypt php5-imagick imagemagick

Pliki startowe dla fastcgi PHP

touch /usr/bin/php-fastcgi vim /usr/bin/php-fastcgi

zawartość pliku:

#!/bin/sh /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www-data -f /usr/bin/php5-cgi

A teraz plik startowy

touch /etc/init.d/php-fastcgi vim /etc/init.d/php-fastcgi

Zawartość pliku:

#!/bin/bash PHP_SCRIPT=/usr/bin/php-fastcgi FASTCGI_USER=www-data RETVAL=0 case "$1" in start) su - $FASTCGI_USER -c $PHP_SCRIPT RETVAL=$? ;; stop) killall -9 php5-cgi RETVAL=$? ;; restart) killall -9 php5-cgi su - $FASTCGI_USER -c $PHP_SCRIPT RETVAL=$? ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL

Dodajemy autostart PHP przy starcie maszyny:

update-rc.d php-fastcgi defaults

Uruchamiamy PHP fastcgi

/etc/init.d/php-fastcgi start

Konfiguracja Nginx-a

W katalogu: /etc/nginx/sites-enabled utowrzymy sobie plik naszej domeny: domena.pl oraz ustawimy połączenie do fastcgi dla plików php

touch /etc/nginx/sites-enabled/domena.pl vim /etc/nginx/sites-enabled/domena.pl

Przykładowa zawartość pliku.

server { listen 80; server_name domeny.pl www.domena.pl; #nazwa domeny można dać *.domena.pl dla wildcarda access_log /var/log/access.log; #access logi error_log /var/log/error.log; # error logi server_tokens off; # ukrywa wersje nginx-a location / { root /var/www; # katalog root strony www index index.html index.php; # jakie plik sa indeksem strony } location ~ \.php$ { root /var/www; # katalog root strony www set $script $uri; set $path_info ""; if ($uri ~ "^(.+\.php)(/.+)") { set $script $1; set $path_info $2; } include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$script; fastcgi_param SCRIPT_NAME $script; fastcgi_param PATH_INFO $path_info; } }

I to wszystko :) restartujemy serwer i działamy.

/etc/init.d/nginx restart 

linux internet serwery

Komentarze

0 nowych
tfl   8 #1 28.03.2012 14:47

dodalbym jeszcze edycje /etc/hosts zeby domena.pl kierowala na localhost... chyba, ze nie trzeba, nie ogarniam linxow :)

A da sie zrobic taki pre config dla nginxa, zeby za kazdym razem nie includowac dla domen parametrow fastcgi? Generalnie, zeby wywalic wszystko co sie powtarza ?

wszerad   6 #2 28.03.2012 14:48

Zastanawiam się czy nginx jest potrzebny jako warstwa pomiędzy siecią a php? Można prosić o wskazanie jakiś korzyści?

djgrzenio   9 #3 28.03.2012 15:22

@tfl i tak nie. jak widzisz w sekcji od php pokazujesz mu skad pobiera pliki od danego projektu, oczywiscie jak by robic katalogi o nazwie servera mozna by uzywac zmiennej $server lub cos innego

@wszerad nginx jest webserverm i nie ma modulu php jak apache, python, ruby czy php lub perl dzialaja tutaj w trybie fastcgi.

oczywiscie sa inne opcje ciekawe dla nginxa, jak wykorzystanie go jako servers proxy dla apache lub innego servera naprzyklad aolserver (i to rozwiazanie ja wykorzystuje)

inna konfiguracja jest dodanie odpowiednich naglowkow dla plikow statycznych jak js css czy pdf naprzyklad z wygasnieciem 30dni zeby user nie musial co wizyte tego pobierac za kazdym razem a lecialo mu z cache przegladarki

djgrzenio   9 #4 28.03.2012 15:23

2 akapit -> mialo byc revers proxy a nie servers proxy

wszerad   6 #5 28.03.2012 15:36

@djgrzenio
Ale apache posiada możliwość serwowania plików statycznych i wierzyć mi się nie chce, żeby tak podstawowej sprawy jak "cache-control" nie było. A i w tym przykładzie nginx działa jako proxy bo przekierowuje zapytania o pliki php. Więc nadal nie bardzo widzę sens...

Mifczu   12 #6 28.03.2012 15:40

No właśnie widziałem sporo konfiguracji gdzie za nginx jest apache jakie są korzyści z tym związane? I czym w praktyce w PHP różni się twoja konfiguracja od nginx -> apache -> php?

  #7 28.03.2012 15:50

@wszerad:
Oczywiście że Apache może, ale czemu nie zrzucić to na nginxa, który jest bardzo lekki, bierze bardzo mało pamięci no i nie będzie nam tworzył ogromu procesów dla samych treści statycznych? Gdy damy zamiast niego nginx lub lighttpd, to od razu odciążamy maszynę. Cache control oczywiście jest w apache, nawet wygodniej regulowane, bo z poziomu plików .htaccess (w nginx w plikach konfiguracyjnych, no chyba, że by się załączało jakiś plik będący w katalogu www).

Sam używam również połączenia nginx + php + mysql, acz nieco inaczej. Może nawet opiszę w wolnym czasie jak to wygląda + swoje obserwacje.

djgrzenio   9 #8 28.03.2012 16:03

@wszerad porownanie - aplikacja X na apache zjadala mi 3GB ramu po przerzuceniu sie na nginxa juz 780mb ramu. przy 1000 userow bedacych na aplikacji, nginx pozatym jest duzo wydajniejszy i umie wiecej requestow obsluzyc, mozna go tez klastrowac bardzo latwo. pozatym nginx w tym przykladzie nie dziala jako proxy. php kjest w trybie fastcgi, nie jest samo dla siebie webserverem a cos musi pokazac wynik php do przegladarki

@mifczu minusem nginxa jest to ze reguly rewrite trzeba dla niego pisac inne, a czasem no potrzeba apache do jakiegos konkretnego projektu

wszerad   6 #9 28.03.2012 16:25

Dobra jeszcze jedno pytanie: czy sesje działają normalnie?

djgrzenio   9 #10 28.03.2012 16:39

@szerad chodzi ci o sesje php? tak. php dziala jak najbardziej normalnie.

oczywiscie dla wiekszej wydajnosci warto sie zainteresowac rozwiazaniami typu memcached

djgrzenio   9 #11 28.03.2012 16:40

a dodam tylko ze apache tez moze obslugiwac php w trybie fastcgi a nie tylko modulu

Draqun   9 #12 28.03.2012 19:48

Może się przydać, dodam sobie do zakładek.

pozdrawiam.

  #13 28.03.2012 22:24

O co w tym wszystkim chodzi? Z czym to się je? Próbuję się coś dowiedzieć, jakieś opisy co do czego służy,a tu nic. Zainstaluje to co w tytule i co z tego będę miał?

  #14 29.03.2012 06:31

Dodam, że warto zainteresować się PHP-FPM i użyciem uniksowych socketów zamiast TCP pomiędzy PHP a nginx.

@wszerad
PHP 5.4 posiada tryb serwera, ale jest on przeznaczony wyłącznie do celów developerskich, nie do środowisk produkcyjnych. Ogólnie bardzo fajna sprawa, bo uruchomienie serwera jest tak proste jak:
php -S localhost:80

  #15 29.03.2012 18:07

php5-fcgi to dosc slabe rozwiazanie, o wiele lepiej sprawuje sie php-fpm i w dodatku robi mniej problemow (fcgi czesto sie wywala).
Co do pytan w komentarzach, nginx jest szybszy od apache i potrafi obsluzyc wiece polaczen w efekcie coraz popularniejsze staje sie stosowanie go jako glownego serwera http albo jako proxy dla apache czy tez nawet serwerow poczty. Dodatkowo nginx sprawuje sie o niebo lepiej niz apache przy ruby czy python

djgrzenio   9 #16 30.03.2012 08:16

@ria.dev akurat ja uzywam fastcgi i nie narzekam na stabilnosc, jednak przyznam sie ze u mnie w php chodzi tylko jeden plik, reszta juz za proxy w tcl napisana, a co proxy w poczcie to mnie zaskoczyles.. musze to rozkminic :D

djgrzenio   9 #17 30.03.2012 08:17

ogolnie poczatkowo nginx w moim przypadku robil tylko za revers proxy zastepujac starego pounda

djgrzenio   9 #18 30.03.2012 08:18

@ria.dev racja nignx jest wydajniejszy od apache chociazby dlatego ze jest wielowatkowy a nie wieloprocesowy

  #19 30.03.2012 17:49

@djgrzenio
Poprzegladaj dokumentacje nginx, jego mozliwosci sa naprawde spore i nie ograniczaja sie tylko do typowego serwera www. W przypadku gdy masz serwer z duza iloscia klientow/pracownikow czy tez kilka serwerow z rodzielonymi uslugami nginx potrafi konkretnie przyspieszyc wiele operacji (ftp, ssh, poczte etc)

  #20 02.05.2014 19:32

Jak podłączyć phpmyadmin? :)

  #21 07.02.2015 12:41

Po pierwsze primo za rozbicie na path_info,path_translated i script_name obecnie powinno się uzywać tylko i wyłączenie fastcgi_split_path. Po drugie, ~ \.php$ z uwagi na tego dolara na końcu dopasowuje ścieżki tylko zakończone ciągiem php, więc ciężko będzie w Twoim przypadku znaleźć jakiekolwiek PATH_INFO, ponieważ każde wywołanie typu plik.php/path/info da wynik w postaci 404. Jedynie plik.php/path/info.php, by zadziałało, ale to jakoś bez sensu :) Z tego też powodu zwykle można dać try_files $uri $uri/ router_aplikacji.php?$args;
Ale to od aplikacji zależy. Przy okazji bez możliwości security.limit_extensions, które się pojawiło dopiero niedawno w php, dzięki takiej konstrukcji może ktoś ślicznie wgrać do jakiejś aplikacji obrazek, będący skryptem php i go wykonać.. Jak ? Np. umożliwiasz ludziom upload w podkatalogu /upd. Ktoś tam daje plik moj.png, o zawartości: - jak myslisz, co się stanie, jak ktoś wpisze w przeglądarce: http://twoj_srv/upd/moj.png/cos.php ? Podpowiedź - bez limit_extensions obrzek się wykona jako skrypt php. Pozdrawiam