Cum instalam (FEMP) Nginx, MySQL, si PHP pe FreeBSD 10.1

Aceste 4 elemente folosite impreuna, vor forma un mix de stabilitate si performanta pe serverul dumneavoastra, mai ales datorita sistemului de operare FreeBSD care aduce un mare plus in alocarea resurselor necesare intr-un mod destul de subtil, incat sa nu se creeze o supra-incarcare a serverului.
Deci, sa incepem instalarea. Prima data va fi nevoie sa instalam pachetele necesare prin comanda:

sudo pkg install nginx mysql56-server php56 php56-mysql

Aceasta va instala Nginx ca webserver, serverul MySQL pentru managementul bazelor de date si limbajul de procesare PHP pentru continutul dinamic pe care il vom avea pe site/uri.
In continuare vom executa comanda rehash pentru a actualiza sistemul dupa noile modificari.

rehash

Pornirea serviciilor
Pentru aceasta avem nevoie de variabila rcvar, iar prin executarea comenzii

grep rcvar /usr/local/etc/rc.d/*

vom obtine un rezultat ca acesta:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/mysql-server:rcvar=mysql_enable
/usr/local/etc/rc.d/nginx:rcvar=nginx_enable
/usr/local/etc/rc.d/php-fpm:rcvar=php_fpm_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

In acest output vedem serviciile pe care le-am instalat, dar care inca nu sunt active. In continuare va trebui sa editam cateva fisiere, asa ca pentru comoditate va sfatuiesc sa folositi editorul nano, in loc de vi. Pentru a-l instala vom executa comanda:

sudo pkg install nano
rehash

Apoi, vom edita fisierul /etc/rc.conf cu comanda:

sudo nano /etc/rc.conf

unde va trebui sa avem, in plus urmatoarele linii:

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

Vom apasa CTRL X pentru salvarea fisierului.
In continuare, ne vom ocupa de serviciul PHP-FPM.

cd /usr/local/etc

Unde vom edita fisierul php-fpm.conf

sudo nano php-fpm.conf

Folosind CTRL W, vom cauta linia aceasta

listen = 127.0.0.1:9000

si o vom face sa arate asa

listen = /var/run/php-fpm.sock

pentru a putea sa folosim socket-uri. Dupa aceasta, vom cauta grupul de linii

;listen.owner = www
;listen.group = www
;listen.mode = 0660

si il vom decomenta, stergand punt si virgula din fata liniilor. Salvam si iesim.
In etapa urmatoare vom pune in uz fisierul de configuratie al PHP-ului, prin comanda

sudo cp php.ini-production php.ini

si il vom edita

sudo nano php.ini

.
Vom cauta linia ce contine

cgi.fix_pathinfo

, o vom decomenta, iar la final ii vom seta valoarea 0:

cgi.fix_pathinfo=0

. Salvam si iesim, iar mai apoi pornim serviciul PHP-FPM prin comanda

sudo service php-fpm start

Configurarea serverului MySQL
Pentru a incepe configurarea, trebuie mai intai sa pornim serverul prin comanda

sudo service mysql-server start

si sa incepem un proces de instalare/configurare a acesteia:

sudo mysql_secure_installation

. Vom intampina un mesaj de introducere a parolei pentru userul curent

Enter current password for root (enter for none):

, dar vom apasa enter pentru a trece peste acest pas. Apoi, vom intampina mesajul

Set root password? [Y/n]

, vom apasa Y si enter pentru confirmare si ne vom alege o parola administrativa pentru serverul MySQL.
Ultimul pas este acela de a porni serverul, iar comanda necesara este

sudo service mysql-server restart

Dupa ce serverul a pornit, ne putem concentra asupra configurarii serverului web.
Primul pas este pornirea acestuia

sudo service nginx start

. In continuare, ne vom duce in folderul /usr/local/etc/nginx, prin comanda

cd /usr/local/etc/nginx

, unde vom modifica fisierul nginx.conf.

sudo nano nginx.conf

Vom decomenta directiva user, de la inceputul fisierului si o vom seta cu valoarea www, deoarece instanta PHP-FPM cauta aceasta configurare.
Linia va arata asa:

user www;

Apoi, va trebui sa setam worker_processes cu numarul de CPU-uri pe care le are serverul. Pentru a afla acest numar vom tasta comanda

sysctl hw.ncpu

in linia de comanda. Pentru mine rezultatul este 4, asa ca linia va arata asa:

worker_processes 4;

In continuare, vom seta fisierul cu log-uri, prin directiva

error_log /var/log/nginx/error.log info;

In blocul http, vom seta log-urile de acces, prin linia corespunzatoare:

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

In block-ul server, vom modifica server_name cu domeniul nostru sau cu adresa IP a serverului nostru. Putem face ca serverul sa raspunda si la host-ul www, prin adaugarea acestuia dupa domeniul principal. De exemplu:

server {
    listen          80;
    server_name     silviustroe.com www.silviustroe.com;

    . . .

Vom configura directivele root si index din block-ul server. Radacina noastra va fi /usr/local/www/silviustroe.com si directiva index ar trebui sa serveasca index.php inainte de a se uita dupa fisierele index.html sau index.htm
In directiva de locatie va trebui configurata directiva try_files pentru a servi fisierele catre utilizatori sau pentru a returna erori 404 in cazul negasirii lor.

server {

    . . .

    root /usr/local/www/silviustroe.com;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    . . .

In continuare vom folosi socket-ul configurat mai devreme in php-fpm.conf. Va trebui sa setam SCRIPT_FILENAME pentru ca PHP-ul sa stie ce sa execute.

server {

    . . .

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }

Toate puse la un loc, ar trebui sa arate cam asa:

user  www;
worker_processes  4;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

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

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

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  silviustroe.com www.silviustroe.com;
        root /usr/local/www/silviustroe.com;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

Salvam si inchidem fisierul, dupa ce am terminat. In continuare, vom crea folderele si fisierele necesare pastrarii de log-uri

sudo mkdir -p /var/log/nginx
sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log

si vom crea din nou directoarele, fara legaturi:

sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx

Pentru a ne testa serverul, vom copia un fisier html in directorul radacina.

sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/silviustroe.com

dar si un fisier php, pentru a vedea daca totul functioneaza cum trebuie:

sudo nano /usr/local/www/nginx/info.php

unde vom introduce

<?php phpinfo(); ?>

.
Salvam si iesim. Pentru a vedea daca avem erori de configuratie, introducem comanda

sudo nginx -t

unde vom primi ca output

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Vom restarta serverul:

sudo service nginx restart

si vom testa rezultatele.
Accesam http://silviustroe.com, respectiv host-ul sau IP-ul setat de dumneavoastra, iar rezultatul ar trebui sa arate cam asa:
default nginx
Apoi vom accesa http://silviustroe.com/info.php unde vom avea pagina
php freebsd nginx
Deoarece contine informatii senzitive, vom sterge fisierul info.php

sudo rm /usr/local/www/silviustroe.com/info.php

In concluzie, trebuie sa aveti acum un server complet functional, ruland Nginx care poate procesa continut dinamic PHP si poate folosi MySQL pentru a stoca informatii.
Configuratia prezentata poate fi folosita ca o baza pentru o varietate a altor configuratii si aplicatii web.

Silviu Stroe
I'm Silviu and I run Brainic, a mobile-focused software agency. I'm also a member of Nokia and Yahoo wall of fame. My interests are in low-code/no-code development and bleeding-edge technologies.

Leave a Reply

Your email address will not be published. Required fields are marked *