前言
LNMP 是流行的建站环境,它可以驱动绝大多网站程序。首字母 L 表示在 Linux 上运行,包含有 Web 服务器(Nginx),MySQL 数据库(MariaDB),动态内容处理器(PHP)。
为方便安装和后续更新,本教程使用系统自带软件源或可信任第三方软件源安装。它们区别是前者由于 RHEL 维护风格偏保守,软件版本普遍老旧(但仍提供安全更新),后者则可以安装较新版软件。
本文操作环境为 CentOS 7,更高系统版本通常也适用,只要涉及操作组件没啥大变动。
安装 Nginx
CentOS 软件源里没有 Nginx,需要从 EPEL 或添加软件官方源安装。这里我们选择前者。
在添加 EPEL 源后,用 Yum 安装 Nginx。
sudo yum -y install nginx
设置允许 HTTP
HTTPS
端口访问。若系统没启用 Firewalld 防火墙可以跳过此步。
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload
运行 Nginx 服务并设置开机启动。
sudo systemctl start nginx sudo systemctl enable nginx
安装 MariaDB
MariaDB 是 MySQL 的一个分支,用于替代 MySQL 的知名衍生版。它由 MySQL 创始人主导开发,依靠开源社区维护。现今许多公司用 MariaDB 取代 MySQL,个中原因除了性能优势。还有自从 MySQL 被 Oracle 收购,为避免潜在的闭源风险,例如产品趋于商业化、漏洞修复速度变慢等。
这里我们也跟大队选用 MariaDB 做数据库,MariaDB 与 MySQL 保持兼容,不必担心程序运行。
自 CentOS 7 开始,默认软件源加入了 MariaDB,直接安装就行。MariaDB 官方也提供安装源。
sudo yum -y install mariadb-server
运行 MariaDB 并设置开机启动。
sudo systemctl start mariadb sudo systemctl enable mariadb
执行mysql_secure_installation
脚本设置数据库 root 密码,以及删除默认测试账户和数据库。
sudo mysql_secure_installation
提示输入 root 密码,由于我们刚安装完没有设置,直接按 Enter
进入下一步。
Enter current password for root (enter for none):
按提示设置 MariaDB root 账户密码,选择 Y
回车后输入两遍密码完成设置。
Set root password? [Y/n]
接下来的几个选项都选Y
,这将删除测试账户和数据库,以及禁用远程 root 登录并刷新权限表。
Remove anonymous users? [Y/n] Disallow root login remotely? [Y/n] Remove test database and access to it? [Y/n] Reload privilege tables now? [Y/n]
到此,MariaDB 已完成初始化配置,之后再介绍如何创建数据库使用。
安装 PHP
安装 PHP 及相关软件,包括 MySQL/MariaDB PHP 支持和 FastCGI 处理器。
sudo yum -y install php php-mysql php-fpm
将 PHP 配置文件里的 cgi.fix_pathinfo
参数行取消注释,并设置值为 0
。这有助防范 PHP 解释器被欺骗执行到恶意文件,这是有关这个问题的详细信息。
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php.ini
修改 php-fpm
配置文件,将默认 apache
用户/组改为 nginx
。
sudo sed -i 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf sudo sed -i 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf
启动 php-fpm
服务并设置开机自启。
sudo systemctl start php-fpm sudo systemctl enable php-fpm
测试 LNMP
安装完各组件后我们测试下搭建的LNMP是否可以正常工作。
创建数据库和账户
用数据库 root 账户登录 SQL Shell,输入之前设置的密码。
mysql -u root -p
创建一个数据库,名称可随意(不区分大小写),譬如 testdb
。
CREATE DATABASE testdb;
创建数据库账户,用户名 testuser
,密码 password
,按需修改。
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'password';
赋予 testdb
数据库管理权限给上面创建的 testuser
账户。
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
完成后用 quit
退出。日后若对现有数据库权限表有修改,需运行 FLUSH PRIVILEGES;
命令刷新。
编辑 Nginx 配置文件
Nginx 配置文件路径是 /etc/nginx/nginx.conf
,可以用 nginx -V
命令查询。
在配置文件里有个监听 80 端口的默认 server{...}
,我们用下面内容更换这块内容。较之前的默认内容,这里添加了 FastCGI 规则以支持 PHP。
补充:如果用软件官方源安装的 Nginx,这个文件内可能没有 server{...}
。而是链接到单个配置文件,路径通常为 /etc/nginx/conf.d/default.conf
。
sudo vi /etc/nginx/nginx.conf
server { listen 80; listen [::]:80; server_name localhost; root /usr/share/nginx/html; index index.html index.htm index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } }
上面配置可以运行静态网站,运行网站程序可能有问题,里面的 try_files
规则要改,后面再介绍。
刷新 PHP 和 Nginx 服务,使修改配置生效。
sudo systemctl restart php-fpm sudo nginx -s reload
补充:如果刷新 Nginx 配置遇到以下错误,表示缺失 fastcgi.conf
文件。
nginx: [emerg] open() "/etc/nginx/fastcgi.conf" failed (2: No such file or directory) in /etc/nginx/conf.d/default.conf:13
需要从官方源码里下载文件补上,之后再尝试刷新。
cd /etc/nginx && sudo wget https://raw.githubusercontent.com/nginx/nginx/master/conf/fastcgi.conf
创建测试页面
在默认网站目录下创建一个测试页面文件。
sudo vi /usr/share/nginx/html/test.php
内容如下,修改其中的数据库账号信息。
<html> <head> <meta charset="utf-8"> <title>LEMP 测试页面</title> </head> <body> <?php echo '<p>测试结果:</p>'; $servername = "localhost"; $username = "testuser"; $password = "password"; $conn = mysqli_connect($servername, $username, $password); if (!$conn) { exit('<p>Nginx、PHP 组件工作正常,MySQL 连接失败。<p>' . mysqli_connect_error()); } echo '<p>Nginx、PHP 组件工作正常,MySQL 连接成功。</p>'; ?> </body> </html>
浏览器访问 http://服务器IP/test.php
测试是否正常,没问题后删除此文件。
可选项:再次修改默认 server{...}
,禁止访问 Web 服务器默认目录,重新加载 Nginx 配置生效。
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 403; # root /usr/share/nginx/html; }
开始部署网站
测试 LEMP 可用后就开始部署网站了。首先创建网站目录,红色字符替换为你的域名。
sudo mkdir -p /var/www/www.example.com
如果之后安装程序遇到无法写入问题,请将网站目录权限改为 Nginx 用户及用户组。如果更改后还是没权限,可能与启用了 SELinux 有关(Discuz! 就会这样),禁用即可。
chown nginx:nginx -R /var/www/www.example.com
创建网站 Nginx 配置文件。不同网站程序适用的规则可能有不同,热门程序网上可以找到示例。遇到不懂其作用的参数最好先搜索了解,Nginx 配置规范可以看下这个 FAQ 文档。
sudo vi /etc/nginx/conf.d/www.example.com.conf
以下是一个适用 WordPress 程序的配置,可以直接拿来使用。
# 根域名重定向到 WWW 站点 server { listen 80; listen [::]:80; server_name example.com; return 301 $scheme://www.example.com$request_uri; } # WWW 站点配置,设置了静态资源缓存时间,并禁止访问上传目录内的 PHP 文件 server { listen 80; listen [::]:80; server_name www.example.com; root /var/www/www.example.com; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; } location ~ .*\.(png|jpg|jpeg|gif|bmp)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~* /(?:uploads|files)/.*\.php$ { deny all; } }
之后刷新 Nginx 配置,上传网站文件,创建数据库及账号,按正常流程安装即可。以下 WP 运行截图。
到此,LNMP 搭建教程就介绍完了