← 茉茉的天空 | 搜索

分类: 转载

共有 1 篇文章

如何在Debian 12上安装LEMP(Nginx、PHP和MariaDB)

Linux LEMP栈是一个用于网络应用程序开发和托管的流行软件捆绑。它由四个关键组件组成: Linux、Nginx(发音为 "Engine-X")、MySQL或MariaDB(一种关系型数据库)和PHP(一种流行的网络编程语言)。在这个设置中,Linux是操作系统,Nginx是Web服务器,处理HTTP请求并提供静态内容,如图片和.css文件。MySQL,或者在我们的例子中,MariaDB被用作数据库系统。PHP是一种脚本语言,用于生成网页内容并与数据库进行动态交互。这些组件构成了一个强大的、可扩展的环境,用于构建和部署网站和Web应用程序。

本指南将教你在几天前发布的Debian 12服务器上安装LEMP栈。你还将学习如何安装像 phpMyAdmin 这样的应用程序。

前提条件

 

  • 一台运行Debian 12的服务器。
  • 一个具有sudo权限的非root用户。
  • 一个完全合格的域名(FQDN),如example.com,指向该服务器。
  • 非复杂防火墙(UFW)已经启用并运行。
  • 一切都已更新
  • $ sudo apt update && sudo apt upgrade

 

一些你的系统需要的软件包。

$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y

这些软件包中的一些可能已经安装在你的系统上。

第1步 - 配置防火墙

在安装任何软件包之前,第一步是配置防火墙以允许HTTP和HTTPS连接。

检查防火墙的状态。

 

$ sudo ufw status

你应该看到类似下面的内容。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

允许HTTP和HTTPs端口。

$ sudo ufw allow http
$ sudo ufw allow https

再次检查状态以确认。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

第二步 - 安装 PHP

Debian 12 的默认版本是 PHP 8.2。你可以通过运行以下命令来安装它。

 

$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd

我们已经安装了PHP的MySQL、CLI、GD、Mbstring和XML扩展。你可以根据你的要求安装任何额外的扩展。

为了始终保持在最新版本的PHP上,或者如果你想安装多个版本的PHP,可以添加Ondrej的PHP资源库。

首先,导入 Sury's repo 的 PHP GPG 密钥。

$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

添加 Ondrej Sury 的 PHP 代码库。

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

更新系统资源库列表。

$ sudo apt update

现在,你可以安装任何版本的PHP。

$ sudo apt install php8.1-fpm php8.1-cli

检查已安装的 PHP 版本。

$ php --version
PHP 8.2.7 (cli) (built: Jun  9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies

第3步 - 安装MariaDB

 

Debian12版默认不包含MySQL,而且他们还没有为它发布一个官方软件包。因此,我们将使用MariaDB。MariaDB也没有一个适用于Debian 12的官方软件包,但Debian已经安装了它。因此,请使用以下命令安装它。

$ sudo apt install mariadb-server

检查MySQL的版本。

$ mysql --version
mysql  Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

运行MariaDB的安全安装脚本。

$ sudo mysql_secure_installation

你会被要求提供根密码。按回车键,因为我们还没有为它设置任何密码。

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):

接下来,你会被问到是否要切换到Unix socket认证方式。unix_socket插件允许你使用你的操作系统凭证来连接到MariaDB服务器。由于你已经有一个受保护的root账户,输入n继续。

OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n

接下来,你会被问到是否要改变你的根密码。在Debian 12中,根密码与系统的自动维护密切相关,所以它应该被搁置。键入n,继续前进。

 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] n

接下来,你会被问到某些问题以提高MariaDB的安全性。键入Y可以删除匿名用户,不允许远程root登录,删除测试数据库,并重新加载权限表。

 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

第4步 - 配置MariaDB

登录到MariaDB外壳。

 

$ sudo mysql

创建一个样本数据库。

MariaDB> CREATE DATABASE exampledb;

创建一个SQL用户账户。

MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';

将数据库的所有权限授予该用户。

MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';

由于我们没有修改根用户,你应该创建另一个SQL用户来执行采用密码认证的管理任务。为这个用户选择一个强密码。

MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;

冲洗用户的权限。

MariaDB> FLUSH PRIVILEGES;

退出外壳。

MariaDB> exit

让我们使用新创建的用户再次登录到MySQL shell。

$ sudo mysql -u exampleuser -p

创建一个测试表。

MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );

插入测试数据。

MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");

重复上述命令多次以添加更多的条目。运行下面的命令来检查表的内容。

MariaDB> SELECT * FROM exampledb.name_list;

你将收到以下输出。

+-----+---------+
| sno | content |
+-----+---------+
|   1 | Navjot  |
|   2 | Adam    |
|   3 | Josh    |
|   4 | Peter   |
+-----+---------+
4 rows in set (0.00 sec)

退出MySQL外壳。

MariaDB> exit

第5步 - 安装Nginx

蝶变12中使用的是旧版本的Nginx。要安装最新的版本,你需要下载官方的Nginx软件库。

导入Nginx的签名密钥。

 

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

添加Nginx稳定版的存储库。

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

更新系统软件库。

$ sudo apt update

安装Nginx。

$ sudo apt install nginx

验证安装。在Debian系统上,以下命令只能在sudo下工作。

$ sudo nginx -v
nginx version: nginx/1.24.0

启动Nginx。

$ sudo systemctl start nginx

检查服务状态。

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago
       Docs: https://nginx.org/en/docs/
    Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 2258 (nginx)
      Tasks: 2 (limit: 1108)
     Memory: 1.8M
        CPU: 6ms
     CGroup: /system.slice/nginx.service
             ??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??2259 "nginx: worker process"

第6步 - 配置PHP-FPM

打开php.ini进行编辑。

 

$ sudo nano /etc/php/8.2/fpm/php.ini

要设置文件上传大小,改变upload_max_filesize和post_max_size变量的值。

upload_max_filesize = 50M
...
post_max_size = 50M

根据你的服务器资源和要求,配置PHP的内存限制。

memory_limit = 256M

按Ctrl + X并在提示下输入Y保存文件。

你也可以使用下面的命令来进行编辑,而不需要打开该文件。

$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini

打开文件/etc/php/8.0/fpm/pool.d/www.conf。

$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf

我们需要将PHP进程的Unix用户/组设置为nginx。找到文件中的user=www-data和group=www-data两行,将其改为nginx。

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...

另外,在文件中找到listen.owner=www-data和listen.group=www-data这两行,把它们改为nginx。

listen.owner = nginx
listen.group = nginx

按Ctrl + X保存文件,并在提示时输入Y。

重新启动PHP-fpm进程。

$ sudo systemctl restart php8.2-fpm

第7步 - 安装 phpMyAdmin

下载phpMyAdmin的英文存档文件。从phpMyAdmin的下载页面抓取最新版本的链接。

 

$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz

为网站创建一个公共目录。

$ sudo mkdir /var/www/html/example.com -p

提取档案到公共目录。

$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com

切换到公共目录。

$ cd /var/www/html/example.com

将提取的目录重命名为不明显的东西,以提高安全性。

$ sudo mv phpMyAdmin-5.2.1-english sm175

步骤 8 - 配置 phpMyAdmin

复制配置文件的样本。

 

$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php

打开该配置文件进行编辑。

$ sudo nano sm175/config.inc.php

找到$cfg['blowfish_secret'] = ''这一行,输入一个32位的随机字符串,用于基于cookie的认证。

你可以使用phpSolved的在线blowfish生成器或通过命令行来完成。

复制该值并粘贴,如图所示。

$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';

按Ctrl + X保存该文件,并在提示时输入Y。

将网站和phpMyAdmin的所有权变更为Nginx服务器。

$ sudo chown -R nginx:nginx /var/www/html/example.com

删除phpMyAdmin的设置目录。

$ sudo rm -rf /var/www/html/example.com/sm175/setup

 

步骤 9 - 配置 Opcache

Opcache是PHP的缓存系统。它的工作原理是将预先编译好的脚本字节码保存在内存中,所以每次用户访问一个页面时,它的加载速度会更快。Opcache 是默认安装的。为了验证,请检查PHP的版本。

 

$ php --version
PHP 8.2.7 (cli) (built: Jun  9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies

这告诉我们Opcache已经安装并可用。如果这里没有显示,你可以通过运行以下命令手动安装它。

$ sudo apt install php-opcache

要改变Opcache的设置,打开文件/etc/php/8.2/fpm/conf.d/10-opcache.ini进行编辑。

$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini

下面的设置应该可以让你开始使用Opcache,为了获得良好的性能,一般推荐使用。你可以通过在底部添加以下几行来启用它。

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

按Ctrl + X保存文件,并在出现提示时输入Y。

重新启动 PHP-FPM。

$ sudo systemctl restart php8.2-fpm

 

第十步--为SSL安装Certbot

我们需要安装Certbot来生成Let's Encrypt提供的免费SSL证书。

你可以使用 Debian 仓库安装 Certbot,或者使用 Snapd 工具获取最新版本。我们将使用 Snapd 版本。

Debian 12版没有安装Snapd。安装Snapd软件包。

 

$ sudo apt install snapd

运行以下命令以确保你的Snapd版本是最新的。

$ sudo snap install core
$ sudo snap refresh core

安装Certbot。

$ sudo snap install --classic certbot

使用下面的命令,通过在/usr/bin目录下创建符号链接,确保Certbot命令能够被运行。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证Certbot是否正常运行。

$ certbot --version
certbot 2.6.0

第十一步 - 测试站点

 

创建一个站点

创建一个站点并且编辑一个页面

 

$ sudo nano /var/www/html/example.com/index.php

将以下代码粘贴在其中:

<?php
$user = "exampleuser";
$password = "YourPassword2!";
$database = "exampledb";
$table = "name_list";

try {
    $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
    echo "<h2>Members List</h2><ol>"; 
    foreach($db->query("SELECT content FROM $table") as $row) {
        echo "<li>" . $row['content'] . "</li>";
    }
    echo "</ol>";
}   catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

按Ctrl + X并在提示时输入Y来保存文件。

创建一个SSL证书

运行以下命令来生成SSL证书:

 

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d example.com

上述命令将下载一个证书到你服务器上的/etc/letsencrypt/live/example.com目录。

生成一个Diffie-Hellman组证书。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

检查Certbot更新调度器服务。

$ sudo systemctl list-timers

你会发现snap.certbot.renew.service是计划运行的服务之一。

NEXT                        LEFT          LAST                        PASSED        UNIT                      ACTIVATES
.....
Sun 2023-02-26 06:32:00 UTC 9h left       Sat 2023-02-25 18:04:05 UTC 2h 59min ago  snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-02-26 06:43:20 UTC 9h left       Sat 2023-02-25 10:49:23 UTC 10h ago       apt-daily-upgrade.timer   apt-daily-upgrade.service
Sun 2023-02-26 09:00:06 UTC 11h left      Sat 2023-02-25 20:58:06 UTC 5min ago      apt-daily.timer           apt-daily.service

对该进程进行一次模拟运行,以检查SSL更新是否工作正常。

$ sudo certbot renew --dry-run

如果你没有看到任何错误,你就一切就绪了。你的证书将自动更新。

配置Nginx

创建并打开文件/etc/nginx/conf.d/example.conf进行编辑。

 

$ sudo nano /etc/nginx/conf.d/example.conf

将以下代码粘贴在其中:

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;

    access_log  /var/log/nginx/example.com.access.log;
    error_log   /var/log/nginx/example.com.error.log;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    root /var/www/html/example.com;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Pass PHP Scripts To FastCGI Server
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; #depends on PHP versions
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  example.com;
    return 301   https://$host$request_uri;
}

按Ctrl + X保存文件,并在提示时输入Y。

打开文件/etc/nginx/nginx.conf进行编辑。

$ sudo nano /etc/nginx/nginx.conf

在include /etc/nginx/conf.d/*.conf;这行之前添加以下内容。

server_names_hash_bucket_size  64;

按Ctrl + X保存该文件,并在提示时输入Y。

验证你的Nginx配置。

$ sudo nginx -t

如果你没有看到任何错误,这意味着你可以正常运行了。启动Nginx服务器。

$ sudo systemctl start nginx

在浏览器中访问https://example.com,加载你的网站,你会看到以下页面:

你可以通过在浏览器中访问网址https://example.com/sm175,访问你的phpMyAdmin安装。你可以输入你的管理用户或之前创建的用户来登录。

总结

我们的教程到此结束,你学会了如何在 Debian 12 服务器上建立 LEMP 堆栈并制作一个演示网站。