LNMP 手动安装配置(CentOS 篇)

Eric 教程 203 次浏览 抢沙发

更新:这是基于 CentOS 8 的更新版,里面增加了申请 SSL 证书步骤,并补充 SELinux 设置规则以避免潜在的读写限制问题。

前言

LNMP 是流行的建站环境,它可以驱动绝大多网站程序。首字母 L 表示在 Linux 上运行,包含有 Web 服务器(Nginx),MySQL 数据库(MariaDB),动态内容处理器(PHP)。

为方便安装和后续更新,本教程使用系统自带软件源或可信任第三方软件源安装。它们区别是前者由于 RHEL 维护风格偏保守,软件版本普遍老旧(但仍提供安全更新),后者则可以安装较新版软件。

本文操作环境为 CentOS 7,更高系统版本通常也适用,只要涉及操作组件没啥大变动。

安装 Nginx

CentOS 软件源里没有 Nginx,需要从 EPEL 或添加软件官方源安装。这里我们选择前者。

在添加 EPEL 源后,用 Yum 安装 Nginx。

sudo yum -y install nginx

设置允许 HTTPHTTPS 端口访问。若系统没启用 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 运行截图。

Welcome to WordPress

到此,LNMP 搭建教程就介绍完了,后续再说下如何生成SSL证书启用HTTPS。

发表评论

电邮地址用于 Gravatar 头像显示,不会被公开可见。