Tento tutoriál vám ukáže instalaci webového serveru Nginx na Debian 9 (Stretch). Nginx (vyslovováno jako „engine x“) je bezplatný, open-source, vysoce výkonný HTTP server. Nginx je známý svou stabilitou, bohatou sadou funkcí, jednoduchou konfigurací a nízkou spotřebou zdrojů. Tento tutoriál ukazuje instalaci Nginx s podporou PHP (prostřednictvím PHP-FPM) a MySQL a MariaDB. Toto nastavení je často označováno jako LEMP =L inux + nginx (vyslovováno „e ngine x") + M ySQL + P HP).
Předběžná poznámka
V tomto tutoriálu používám název hostitele server1.example.com s IP adresou 192.168.1.100. Tato nastavení se pro vás mohou lišit, takže je musíte v případě potřeby nahradit. Měli byste mít server Debian 9, jako základní systém pro tento tutoriál použiji minimální server Debian.
Aktualizujte systém Debian
Než začneme s nastavením Nginx, doporučujeme aktualizovat seznamy balíčků a nainstalovat všechny čekající aktualizace. Spuštěním následujících příkazů nainstalujte všechny čekající aktualizace.
apt-get update
apt-get upgrade -y
K úpravě konfiguračních souborů později použiji nano editor. Nano lze nainstalovat pomocí tohoto příkazu:
apt-get -y install nano
Instalovat Nginx
Nginx je k dispozici jako balíček pro Debian 9, který můžeme nainstalovat pomocí tohoto příkazu:
apt-get -y install nginx
Nyní spusťte webový server Nginx:
systemctl start nginx.service
Zadejte do prohlížeče IP adresu nebo název hostitele svého webového serveru (např. http://192.168.1.100) a zobrazí se vám následující stránka:
Výchozí kořen dokumentu nginx na Debian Linuxu je /var/www/html.
Instalovat MySQL nebo MariaDB
V tomto kroku vám ukážu, jak nainstalovat MySQL nebo MariaDB. Můžete si vybrat, který databázový systém preferujete. Jen se ujistěte, že nainstalujete pouze jeden databázový stroj a ne MySQL a MariaDB společně.
Instalovat MySQL
Balíčky MySQL pro Debian 9 lze získat přímo od společnosti Oracle. Oracle poskytuje balíček úložiště MySQL, který integruje úložiště Oracle MySQL do Debianu, takže můžeme nainstalovat a aktualizovat MySQL pomocí apt. Získejte balíček úložiště MySQL apt zde pro případ, že stažení wget níže selže kvůli změnám v adrese URL ke stažení.
cd /tmp
wget https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb
dpkg -i mysql-apt-config_0.8.9-1_all.deb
Zvolte konfiguraci 'OK' v seznamu, poté zaostřete na tlačítko OK v zápatí a stiskněte enter. Tím se vybere aktuální stabilní verze, což je MySQL 5.7.
Nyní aktualizujeme seznam balíčků a nainstalujeme balíček serveru MySQL a klienta.
apt-get update
apt-get -y install mysql-community-client mysql-community-server
Instalační program MySQL vás požádá o nastavení hesla pro uživatele root MySQL. Vyberte si dlouhé a bezpečné heslo, protože toto heslo umožňuje plný administrativní přístup k databázi MySQL.
Znovu zadejte požadované heslo.
Instalovat MariaDB
Abychom mohli nainstalovat MariaDB, spustíme:
apt-get -y install mariadb-server mariadb-client
Na rozdíl od instalačního programu MySQL instalační program MariaDB během instalace nenastaví heslo uživatele root. Chcete-li zabezpečit instalaci MariaDB, odeberte anonymního uživatele a deaktivujte testovací databázi, spusťte tento příkaz:
mysql_secure_installation
Odpovězte na otázky následovně:
Change the root password? [Y/n] <-- y
New password: <-- Enter a new MySQL root password
Re-enter new password: <-- Repeat the MySQL root password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Remove test database and access to it? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y
Instalace PHP
Můžeme zajistit, aby PHP fungovalo v nginx pomocí PHP-FPM (PHP FastCGI Process Manager). Toto je alternativní implementace PHP FastCGI s některými dalšími funkcemi užitečnými pro weby jakékoli velikosti, zejména pro rušnější weby. Nainstalujte PHP 7 následovně:
apt-get -y install php7.0-fpm
PHP-FPM je proces démona (se souborem systemd unit php7.0-fpm.service), který spouští server FastCGI na soketu /var/run/php/php7.0-fpm.sock.
Konfigurace Nginx
Konfigurace Nginx je v /etc/nginx/nginx.conf, který nyní otevíráme:
nano /etc/nginx/nginx.conf
Konfigurace je snadno pochopitelná (více o ní můžete získat zde: https://www.nginx.com/resources/wiki/start/topics/examples/full/ a zde:https://www.nginx.com/ zdroje/wiki/)
Nejprve nastavte keepalive_timeout na rozumnou hodnotu, například 2 sekundy:
[...]
keepalive_timeout 2;
[...]
Virtuální hostitelé jsou definováni v kontejnerech serveru {}. Výchozí vhost je definován v souboru /etc/nginx/sites-available/default – upravme jej následovně:
nano /etc/nginx/sites-available/default
[...] server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]
název_serveru _; dělá z tohoto výchozího catchall vhost (samozřejmě zde můžete také zadat název hostitele jako www.example.com).
Do řádku indexu jsem přidal index.php. root /var/www/html; znamená, že kořen dokumentu je adresář /var/www/html.
Důležitou součástí pro PHP je umístění ~ \.php$ {} stanza. Chcete-li jej povolit, odkomentujte jej, jak je uvedeno výše. Obsahuje dva řádky fastcgi_pass, odkomentujte pouze ten pro soubor php-7.0-fpm.sock.
Nyní uložte soubor a znovu načtěte Nginx:
systemctl reload nginx.service
Dále otevřete /etc/php/7.0/fpm/php.ini...
nano /etc/php/7.0/fpm/php.ini
... a nastavte cgi.fix_pathinfo=0:
[...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://php.net/cgi.fix-pathinfo cgi.fix_pathinfo=0 [...]
... pak možná budete chtít zvýšit limit POST a limit nahrávání souborů:
post_max_size = 25M
upload_max_filesize = 20M
Pokud plánujete nahrávat velké soubory pomocí PHP, měli byste zvýšit hodnoty dokonce na 500 milionů nebo více. M zde znamená megabajty.
Nakonec možná budete chtít nastavit časové pásmo na místní časové pásmo. V mém případě je časové pásmo:
date.timezone = 'Europe/Berlin'
Seznam podporovaných časových pásem naleznete zde.
Chcete-li použít změny, znovu načtěte PHP-FPM:
systemctl reload php7.0-fpm.service
Nyní vytvořte následující soubor PHP v kořenovém adresáři dokumentu /var/www/html/:
nano /var/www/html/info.php
<?php phpinfo();
Nyní tento soubor nazýváme v prohlížeči (např. http://192.168.1.100/info.php):
Jak vidíte, PHP 7 funguje a funguje přes FPM/FastCGI, jak je znázorněno na řádku Server API. Pokud se posunete dále dolů, uvidíte všechny moduly, které jsou již v PHP povoleny. MySQL zde není uveden, což znamená, že v PHP zatím nemáme podporu MariaDB / MySQL.
Získání podpory MySQL / MariaDB v PHP
Abychom získali podporu MySQL v PHP, můžeme nainstalovat balíček php7.0-mysqlnd. Je dobré nainstalovat některé další moduly PHP, stejně jako je můžete potřebovat pro své aplikace. Dostupné moduly PHP můžete vyhledat takto:
apt-cache search php7.0
Vyberte ty, které potřebujete, a nainstalujte je takto:
apt-get -y install php7.0-mysqlnd php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl
Nyní znovu načtěte PHP-FPM:
systemctl reload php7.0-fpm.service
Nyní znovu načtěte http://192.168.1.100/info.php ve svém prohlížeči a znovu přejděte dolů do sekce moduly. Nyní byste tam měli najít spoustu nových modulů, včetně modulu MySQLi a MySQLnd:
Nastavení PHP-FPM pomocí připojení TCP (volitelné)
Ve výchozím nastavení PHP-FPM naslouchá na soketu /var/run/php/php7.0-fpm.sock a to je doporučený a nejrychlejší způsob připojení PHP k Nginx. Mohou však existovat nastavení, kde chcete nechat Nginx připojit se k PHP přes síť. Je možné, aby PHP-FPM používal TCP spojení. Chcete-li to provést, otevřete /etc/php/7.0/fpm/pool.d/www.conf...
nano /etc/php/7.0/fpm/pool.d/www.conf
... a řádek pro poslech nastavte následovně:
[...] ;listen = /var/run/php5-fpm.sock listen = 127.0.0.1:9000 [...]
Díky tomu bude PHP-FPM naslouchat na portu 9000 na IP 127.0.0.1 (localhost). Ujistěte se, že používáte port, který se ve vašem systému nepoužívá.
Poté znovu načtěte PHP-FPM:
systemctl reload php7.0-fpm.service
Dále projděte konfiguraci Nginx a všechny své vhosty a změňte řádek fastcgi_pass unix:/var/run/php7.0-fpm.sock; na fastcgi_pass 127.0.0.1:9000;, např. takhle:
nano /etc/nginx/sites-available/default
[...]
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
fastcgi_pass 127.0.0.1:9000;
} [...]
Nakonec znovu načtěte Nginx:
systemctl reload nginx.service
Povolení SSL a HTTP/2 v Nginx
Většina webových stránek dnes používá SSL (TLS) k zajištění bezpečného přístupu. V této kapitole vám ukážu, jak vytvořit certifikát SSL a jak aktivovat SSL v Nginx. Můžete buď použít self-signed SSL certifikát, nebo požádat o oficiálně podepsaný SSL certifikát od Let's encrypt. Let#s encrypt SSL certifikáty jsou k dispozici zdarma, ale musíte mít platný název domény, který již odkazuje na váš server v DNS. Pokud ještě nemáte název domény nebo když je váš server v místní síti a není přístupný zvenčí, použijte certifikát SSL s vlastním podpisem. Postupujte podle kroků pro certifikát SSL s vlastním podpisem nebo podle níže uvedeného certifikátu Let's encrypt, ale ne obojí.
Vytvoření certifikátu SSL s vlastním podpisem
Vytvořte soubor klíče SSL pomocí příkazu OpenSSL:
openssl genrsa -out /etc/ssl/private/nginx.key 4096
Potom vytvořte certifikát SSL s vlastním podpisem:
openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650
Příkaz se zeptá na podrobnosti, jako je země, stát, město, název společnosti a název domény.
Aktivujte certifikát SSL s vlastním podpisem v Nginx. Chcete-li to provést, znovu upravte soubor nginx.conf:
nano /etc/nginx/sites-available/default
a serverová část bude vypadat takto:
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl on;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_certificate /etc/ssl/certs/nginx.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
Chcete-li použít změny, restartujte Nginx.
systemctl restart nginx.service
Nyní otevřete https URL vašeho serveru v prohlížeči, např. https://192.169.1.100/. Zobrazí se bezpečnostní varování, které budete muset přijmout, abyste mohli pokračovat. Poté uvidíte úvodní stránku Nginx, varovná ikona v adresním řádku prohlížeče označuje, že používáme certifikát SSL s vlastním podpisem.
Použijte bezplatný certifikát Let's Encrypt SSL
V této kapitole popíši, jak zabezpečit server Nginx pomocí bezplatného certifikátu Let's encrypt SSL. Předpokladem je, že vlastníte název domény, který ukazuje na IP serveru, na který v tuto chvíli instalujete Nginx.
Nainstalujte Certbot, klienta Let's encrypt, který se používá k získání bezplatného certifikátu SSL.
apt-get -y install certbot python-certbot-nginx
Upravte konfigurační soubor webu /etc/nginx/sites-available/default a nastavte název domény (názvů) v řádku server_name:
nano /etc/nginx/sites-available/default
Řádek by měl po úpravě vypadat takto:
server_name example.com;
Nahraďte example.com svým vlastním názvem domény. Pokud máte více názvů domén nebo subdomén, přidejte je oddělené mezerou.
server_name example.com www.example.com otherdomain.tld;
Nyní požadujeme certifikát SSL od let's encrypt pomocí pluginu nginx od Certbot.
certbot --nginx -d example.com
Více domén lze přidat opakováním volby -d. Příklad:
certbot certonly --webroot -d example.com -d www.example.com
Certbot vás požádá o e-mailovou adresu, na kterou budou zasílána oznámení o obnovení. Zde zadejte platnou e-mailovou adresu:
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): [email protected]
Přijměte licenční podmínky zadáním „A“.
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A
Zde je další dialog, který požaduje certifikát SSL. Přidal jsem své odpovědi červeně.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Select the webroot for example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for example.com: (Enter 'c' to cancel):/var/www/html
Select the webroot for www.example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
2: /var/www/html
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2018-04-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Existuje alternativní metoda pomocí možnosti '--nginx' v Certbotu, ale zdá se, že tato metoda momentálně nefunguje kvůli problému TLS-SNI-01 v Let's encrypt. Metoda webroot, jak je ukázáno výše, však funguje dobře.
Nově vygenerovaný certifikát SSL je v podsložce složky /etc/letsencrypt/live/. Přesná cesta je uvedena ve výstupu Certbot.
Nyní přidáme tento certifikát SSL do našeho souboru webu Nginx. Upravte výchozí soubor Nginx:
nano /etc/nginx/sites-available/default
a změňte sekci SSL takto:
[...] server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl on;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]
Nahraďte „example.com“ v cestě certifikátu SSL svým vlastním názvem domény. Chcete-li použít změny, restartujte Nginx.
systemctl restart nginx.service
Obrázek virtuálního počítače
Tento tutoriál je k dispozici jako virtuální stroj připravený k použití ve formátu OVA / OVF pro předplatitele Howtoforge. Formát VM je kompatibilní s VMWare a Virtualboxem a pravděpodobně s některými dalšími nástroji, které dokážou tento formát importovat. Odkaz ke stažení najdete v pravém menu nahoře. Kliknutím na název souboru zahájíte stahování.
Přihlašovací údaje virtuálního počítače jsou:
Přihlášení SSH
Uživatelské jméno:správce
Heslo:howtoforge
Spusťte 'su', abyste se stali uživatelem root, heslo root je také 'howtoforge'.
Obraz virtuálního stroje používá jako databázový server MySQL.
Přihlášení k MySQL
Uživatelské jméno:root
Heslo:howtoforge
Po prvním spuštění změňte hesla.
VM je nakonfigurován pro statickou IP 192.168.1.100, IP lze změnit v souboru /etc/network/interfaces.
Odkazy
- nginx:https://nginx.net/
- PHP:http://www.php.net/
- MySQL: https://www.mysql.com/
- MariaDB: https://mariadb.org/
- Debian:https://www.debian.org/