CentOS手动安装配置LNMP建站环境

Kevin 教程 1,051 次浏览 抢沙发

此教程写给想要手动部署LNMP建站环境的网友参考,文中步骤全部经过作者测试通过,并以具操作性、便于维护、可靠安装源为原则介绍。让你不借助一键安装包的情况下,也能轻松学会搭建LNMP。

简介

LNMP是主流使用的建站环境之一,其名称来自各软件名首字母的集合。L代表Linux系统本身,N代表Nginx提供Web服务,M代表MariaDB负责数据存储,P代表PHP处理动态内容。

准备工作

一台预装CentOS 7系统的VPS。CentOS 6及其它Linux发行版方法可以参考Linode这个系列教程。本文在Linode介绍基础上做了一些补充改善,例如对配置文件写法优化等,更适合新手理解操作。

系统最好为全新环境,以避免不必要麻烦。操作用户需具备root执行权限(可以使用sudo的账户)。

第三方软件源

CentOS系统特点是注重稳定,其长久支持周期导致默认源里的软件版本偏低。如果你网站程序不要求高版本,又没有体验新功能的需要,可以用默认源安装,Red Hat对于基础软件提供长期安全支持

如果你需要使用新版本软件,可以通过IUS源安装,IUS软件源的使用方法之前文章已有介绍。

另一个常用软件源是EPEL,它可以扩展默认源里没有的软件。添加EPEL源只需运行下面命令。

sudo yum -y install epel-release

上面介绍的两个软件源都具有良好信誉并被广泛使用,因此不用担心安全性。类似软件源还有半官方SCL和个人向Remi。前者用法比较特别,主要解决多版本并存问题。后者由Fedora PHP包维护作者提供,软件主要是PHP及相关扩展组件。更多CentOS软件源可查看这个官方介绍

本文将采用系统默认软件源安装各组件,默认源里没有的则用EPEL源安装。

安装 Nginx

CentOS软件源里没有Nginx,需要从EPEL或添加软件官方源安装。这里我们选择前者,比较方便也符合RHEL软件维护精神(不追求版本新,注重测试和稳定性)。

在添加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 头像显示,不会被公开可见。