如何在Debian 9上使用PHP + MySQL(LEMP)安装Nginx

本教程展示了如何在Debian 9上安装Nginx Web服务器,以及MySQL或MariaDB作为数据库,PHP 7和免费让SSL加密SSL ...

如何在Debian 9上使用PHP + MySQL(LEMP)安装Nginx

本教程将向您展示在Debian 9(Stretch)上安装Nginx Web服务器。 Nginx (发音为“engine x”)是一款免费的开源高性能HTTP服务器。 Nginx以其稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。 本教程展示了使用PHP支持(通过PHP-FPM)以及MySQL和MariaDB来安装Nginx。 这种设置通常被称为LEMP = L inux + nginx(发音为“ e ngine x”)+ M ySQL + P HP)。

初步说明

在本教程中,我使用IP地址为192.168.1.100的主机名server1.example.com 。 这些设置可能会有所不同,所以您必须在适当的位置更换它们。 你应该有一个Debian 9服务器,我将使用Debian最小服务器作为本教程的基础系统。

更新Debian系统

建议在我们开始使用Nginx设置之前更新软件包列表并安装所有未决的更新。 运行以下命令来安装任何挂起的更新。

apt-get update
apt-get upgrade -y

我稍后将使用nano编辑器来编辑配置文件。 纳米可以用这个命令安装:

apt-get -y install nano

安装Nginx

Nginx可以作为Debian 9的一个软件包,我们可以用这个命令来安装:

apt-get -y install nginx

现在启动Nginx Web服务器:

systemctl start nginx.service

在浏览器中输入您的Web服务器的IP地址或主机名(例如http://192.168.1.100 ),您将看到以下页面:

Nginx的欢迎页面

Debian Linux上的默认nginx文档根目录是/ var / www / html

安装MySQL或MariaDB

在这一步中,我将向您展示如何安装MySQL或MariaDB。 您可以自由选择您喜欢的数据库系统。 只要确保只安装一个数据库引擎,而不安装MySQL和MariaDB。

安装MySQL

Debian 9的MySQL包可以直接从Oracle获得。 Oracle提供了一个MySQL存储库包,它将Oracle MySQL存储库集成到Debian中,以便我们可以使用apt来安装和更新MySQL。 如果下载的wget下载由于下载URL的更改而失败,请在此处获取MySQL存储库包。

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

选择配置列表中的“确定”,然后将“确定”按钮集中在页脚处,然后按Enter键。 这将选择当前的稳定版本,这是MySQL 5.7。

选择当前稳定的MySQL版本

现在我们将更新软件包列表并安装MySQL服务器和客户端软件包。

apt-get update
apt-get -y install mysql-community-client mysql-community-server

MySQL安装程序将要求您为MySQL根用户设置密码。 选择一个长而安全的密码,因为这个密码允许对MySQL数据库进行完全的管理访问。

设置MySQL根密码

按要求重新输入密码。

安装MariaDB

为了安装MariaDB,我们运行:

apt-get -y install mariadb-server mariadb-client

与MySQL安装程序不同,MariaDB安装程序在安装期间不会设置root密码。 要保护MariaDB安装,请删除匿名用户并禁用测试数据库,请运行以下命令:

mysql_secure_installation

回答如下问题:

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

安装PHP

我们可以通过PHP-FPM(PHP FastCGI Process Manager)使PHP在nginx中工作。 这是一个替代的PHP FastCGI实现,其中一些额外的功能可用于任何规模的站点,尤其是繁忙的站点。 安装PHP 7如下:

apt-get -y install php7.0-fpm

PHP-FPM是一个守护进程(使用systemd单元文件php7.0-fpm.service),它在套接字/var/run/php/php7.0-fpm.sock上运行FastCGI服务器。

配置Nginx

Nginx配置位于/etc/nginx/nginx.conf中 ,我们现在打开:

nano /etc/nginx/nginx.conf

配置很容易理解(您可以在这里了解更多信息: https//www.nginx.com/resources/wiki/start/topics/examples/full/和这里: https//www.nginx.com/资源/ wiki /

首先将keepalive_timeout设置为2秒的合理值:

[...]
keepalive_timeout 2;
[...]

虚拟主机在服务器容器中定义。 默认的虚拟主机是在文件/ etc / nginx / sites-available / default中定义的 - 我们来修改它,如下所示:

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;
}
} [...]

服务器名称 _; 使这个默认的catchall虚拟主机(当然,你也可以指定一个主机名像www.example.com )。

我已将index.php添加到索引行。 root / var / www / html; 意味着文档根目录是/ var / www / html目录。

PHP的重要部分是位置〜\ .php $ {}节。 取消注释,如上所示,以启用它。 有两个fastcgi_pass行包括在内,只取消了php-7.0-fpm.sock文件的注释。

现在保存文件并重新加载Nginx:

systemctl reload nginx.service

接下来打开/etc/php/7.0/fpm/php.ini ...

nano /etc/php/7.0/fpm/php.ini

...并设置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
[...]

...那么你可能想提高POST限制和文件上传限制:

post_max_size = 25M
upload_max_filesize = 20M

当你计划通过PHP上传大文件时,你应该把值提高到500M甚至更多。 M在这里表示兆字节。

最后,您可能需要将时区设置为当地时区。 在我的情况下,时区是:

date.timezone = 'Europe/Berlin'

你可以在这里找到支持的时区列表。

重新加载PHP-FPM以应用更改:

systemctl reload php7.0-fpm.service

现在在文档根目录/ var / www / html /中创建以下PHP文件:

nano /var/www/html/info.php

<?php
phpinfo();

现在我们在浏览器中调用该文件(例如http://192.168.1.100/info.php ):

PHP-FPM信息

如您所见,PHP 7正在运行,并且正在通过FPM / FastCGI进行工作,如Server API行中所示。 如果向下滚动,则会看到所有已经在PHP中启用的模块。 这里没有列出MySQL,这意味着我们在PHP中没有MariaDB / MySQL支持。

在PHP中获取MySQL / MariaDB支持

为了在PHP中获得MySQL支持,我们可以安装php7.0-mysqlnd包。 安装一些其他PHP模块是一个好主意,以及您可能需要它们为您的应用程序。 你可以像这样搜索可用的PHP模块:

apt-cache search php7.0

选择你需要的,并像这样安装它们:

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

现在重新加载PHP-FPM:

systemctl reload php7.0-fpm.service

现在在您的浏览器中重新加载http://192.168.1.100/info.php ,并再次向下滚动到模块部分。 你现在应该在这里找到很多新的模块,包括MySQLi和MySQLnd模块:

PHP内置MySQL支持

使PHP-FPM使用TCP连接(可选)

默认情况下,PHP-FPM正在监听套接字/var/run/php/php7.0-fpm.sock ,这是将PHP连接到Nginx的建议和最快的方法。 但是,可能会有一些设置让Nginx通过网络连接到PHP。 有可能使PHP-FPM使用TCP连接。 要做到这一点,打开/etc/php/7.0/fpm/pool.d/www.conf ...

nano /etc/php/7.0/fpm/pool.d/www.conf

...让线看起来如下:

[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]

这将使PHP-FPM在IP 127.0.0.1本地主机 )上的端口9000上监听。 确保您使用的系统上未使用的端口。

然后重新加载PHP-FPM:

systemctl reload php7.0-fpm.service

接下来通过你的Nginx配置和所有的虚拟主机,并改变行fastcgi_pass unix:/var/run/php7.0-fpm.sock;fastcgi_pass 127.0.0.1:9000; ,例如像这样:

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;
} [...]

最后,重新加载Nginx:

systemctl reload nginx.service

在Nginx中启用SSL

今天大多数网站使用SSL(TLS)来提供安全访问。 在本章中,我将向您展示如何创建SSL证书以及如何在Nginx中激活SSL。 您可以使用自签名SSL证书,也可以请求我们加密的正式签名SSL证书。 让SSL加密SSL证书是免费的,但你必须有一个有效的域名,指向你的DNS服务器已经。 如果您还没有域名,或者当您的服务器位于本地网络且不能从外部访问时,请使用自签名SSL证书。 按照自签名SSL证书的步骤或下面的让我们加密证书,但不能同时遵守这两个步骤。

创建一个自签名的SSL证书

使用OpenSSL命令创建SSL密钥文件:

openssl genrsa -out /etc/ssl/private/nginx.key 4096

使用OpenSSL创建SSL证书密钥

然后创建自签名的SSL证书:

openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650

该命令将要求详细信息,如国家,州,市,公司名称和域名。

用OpenSSL创建一个SSL证书

在Nginx中激活自签名的SSL证书。 为此,请再次编辑nginx.conf文件:

nano /etc/nginx/sites-available/default

并使服务器部分看起来像这样:

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;
}
}

重新启动Nginx以应用更改。

systemctl restart nginx.service

现在在浏览器中打开服务器的https URL,例如https://192.169.1.100/ 。 您将收到安全警告,您必须接受才能继续。 之后,您将看到Nginx的开始页面,浏览器的URL栏中的警告图标表示我们使用自签名的SSL证书。

使用免费的Let's Encrypt SSL证书

在本章中,我将介绍如何使用免费让我们加密SSL证书来保护您的Nginx服务器。 先决条件是您拥有一个域名,指向当前安装Nginx的服务器的IP。

安装Certbot,让我们加密用来获取免费SSL证书的客户端。

apt-get -y install certbot python-certbot-nginx

编辑网站配置文件/ etc / nginx / sites-available / default,并在server_name行中设置你的域名:

nano /etc/nginx/sites-available/default

编辑完成后,该行应如下所示:

server_name example.com;

将example.com替换为您自己的域名。 如果您有多个域名或子域名,请使用空格分隔。

server_name example.com www.example.com otherdomain.tld;

现在我们要求使用Certbot的nginx插件来加密SSL证书。

certbot --nginx -d example.com

可以通过重复-d选项来添加多个域。 例:

certbot certonly --webroot -d example.com -d www.example.com

Certbot会要求您提供一个电子邮件地址,以便将续订通知发送给您。 在此处输入有效的电子邮件地址

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): yourname@example.com

通过输入“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

这里是请求SSL证书的进一步对话框。 我已经用红色添加了我的答案。

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

在Certbot中有一个使用'--nginx'选项的替代方法,但由于Let's encrypt中的TLS-SNI-01问题,此方法似乎并不奏效。 如上所示,webroot方法工作正常。

新生成的SSL证书位于/ etc / letsencrypt / live /文件夹的子文件夹中。 确切的路径显示在Certbot输出中。

现在我们将在我们的Nginx网站文件中添加这个SSL证书。 编辑Nginx的默认文件:

nano /etc/nginx/sites-available/default

并像这样更改SSL部分:

[...]
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;
}
} [...]

用您自己的域名替换SSL证书路径中的“example.com”。 重新启动Nginx以应用更改。

systemctl restart nginx.service

虚拟机映像

本教程已准备就绪,可供Howtoforge用户使用OVA / OVF格式的虚拟机。 VM格式与VMWare和Virtualbox以及其他一些可以导入这种格式的工具兼容。 您可以在顶部的右侧菜单中找到下载链接。 点击文件名开始下载。

虚拟机的登录信息是:

SSH登录

用户名:管理员
密码:howtoing

运行“su”成为root用户,root密码也是“howtoing”。

虚拟机映像使用MySQL作为数据库服务器。

MySQL登录

用户名:root
密码:howtoing

第一次启动后请更改密码。

VM配置为静态IP 192.168.1.100,可以在/ etc / network / interfaces文件中更改IP。