Linux LEMP栈是一个用于网络应用程序开发和托管的流行软件捆绑。它由四个关键组件组成: Linux、Nginx(发音为 "Engine-X")、MySQL或MariaDB(一种关系型数据库)和PHP(一种流行的网络编程语言)。在这个设置中,Linux是操作系统,Nginx是Web服务器,处理HTTP请求并提供静态内容,如图片和.css文件。MySQL,或者在我们的例子中,MariaDB被用作数据库系统。PHP是一种脚本语言,用于生成网页内容并与数据库进行动态交互。这些组件构成了一个强大的、可扩展的环境,用于构建和部署网站和Web应用程序。
本指南将教你在几天前发布的Debian 12服务器上安装LEMP栈。你还将学习如何安装像 phpMyAdmin 这样的应用程序。
$ 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
这些软件包中的一些可能已经安装在你的系统上。
$ 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)
$ 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
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!
$ 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
$ 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"
$ 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
$ 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
$ 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
$ 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
$ 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来保存文件。
$ 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
如果你没有看到任何错误,你就一切就绪了。你的证书将自动更新。
$ 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安装。你可以输入你的管理用户或之前创建的用户来登录。