如何在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
),您将看到以下页面:
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服务器和客户端软件包。
apt-get update
apt-get -y install mysql-community-client mysql-community-server
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 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-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
然后创建自签名的SSL证书:
openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650
该命令将要求详细信息,如国家,州,市,公司名称和域名。
在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登录
用户名:管理员
密码:youcl
运行“su”成为root用户,root密码也是“youcl”。
虚拟机映像使用MySQL作为数据库服务器。
MySQL登录
用户名:root
密码:youcl
第一次启动后请更改密码。
VM配置为静态IP 192.168.1.100,可以在/ etc / network / interfaces文件中更改IP。
链接
- nginx: https : //nginx.net/
- PHP: http : //www.php.net/
- MySQL: https : //www.mysql.com/
- MariaDB: https : //mariadb.org/
- Debian: https : //www.debian.org/