LNMP架构网站的搭建

因为最近接手了学校社团的网站运维工作,并且社团的网站使用的是 LNMP 架构,所以为了学习一下如何部署、配置和运维 LNMP 架构的网站,我把自己的个人网站(也就是这个网站),重新部署成了 LNMP 架构的网站。

在使用 Nginx 之前,我是使用 xampp 的,xampp 将 Apache、MySQL、PHP 和 Perl 集成并都配置好了放在一起,而且还有 phpmyadmin 提供图形化的数据库操作页面,运行 xampp security 命令就能自动帮你完善安全配置等等,可以说是开箱即用的网站搭建工具。而转向使用 Nginx 以后,我就要自己手工配置各个组件让他们协调运行了,想要部署一个有一定安全性的网站,对于我来说还是需要学习一些新知识的。

下面我就介绍一下我是如何搭建的。

一、安装需要的软件

第一步肯定是要知道搭建 LNMP 架构网站需要哪些软件包了,具体看网站具有哪些功能,需要什么程序来提供这些功能。在这里,我需要安装 Nginx、MySQL 和 PHP 三个软件包。

1
2
3
4
sudo apt-get install nginx
sudo apt-get install mysql-server
sudo apt-get install php7.0-fpm
sudo apt-get install php7.0-mysql

MySQl 安装时会显示配置页面,输入初始密码等,并且默认只能本地访问,如果需要更改可以编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 文件。php-fpm(PHP FastCGI Process Manager)在架构中扮演的角色是用于解析 PHP 脚本的后端服务器,php-mysql 是 PHP 软件包的扩展,用于提供 MySQL 数据库连接支持。需要注意的是,要启用 PHP 的 MySQL 支持,需要编辑 /etc/php/7.0/fpm/php.ini 文件,将其中的这句前面的分号(注释)去掉,如下:

1
extension=php_mysqli.dll

使用 service 命令可以控制以上这些软件包启动(start)、重启(restart)、重新加载设置(reload)、停止(stop)、设置检查(configtest,部分命令支持此选项)。

如需要启动 php-fpm 服务,命令行输入下面的命令:

1
sudo service php7.0-fpm start

重新加载设置选项对于配置 Nginx 服务器很常用,当我们在 /etc/nginx/ 目录中配置了虚拟主机或者更改了设置以后,就需要使用 reload 命令来让 Nginx 重新加载配置使它们生效,如下:

1
sudo service nginx reload

软件包全都安装好之后需要配置它们才能相互配合协同工作。

二、配置相应的软件

在配置之前需要了解此架构中各个软件各自扮演了什么角色,从而更合理地配置和更容易地发现和解决问题。

LNMP 中,Nginx 是作为一个反向代理服务器,用于分发静态内容和传递收到的动态访问请求到后端的 PHP FastCGI 进程;PHP FastCGI 进程运行 PHP 脚本,连接 MySQL 服务器等。既然要让它们能够相互通信,那么就要配置相应的通信端口,如果使用了防火墙,也可以直接使用 UNIX 套接字通信。

1.配置 PHP

首先配置 PHP 吧,编辑 /etc/php/7.0/fpm/pool.d/www.conf 文件,设置进程监听的端口(或者 socket)。这里我使用了默认的 socket 作为通信方式,有如下语句:

1
listen = /path/to/your/socket

配置 PHP 的运行用户和组,如 www-data,有:

1
2
user = www-data
group = www-data

配置允许连接的 IP 地址(只允许本地连接请求):

1
listen.allowed_clients = 127.0.0.1

接着保存退出,运行:

1
sudo service php7.0-fpm reload

重新加载设置,若 PHP 还没有启动,就执行 start 指令启动。

2.配置 MySQL

先查看 MySQL 服务器监听的端口号,并在防火墙中开启这个端口(默认为 3306)。

绑定 MySQL 的 IP 地址(本地):

1
bind-address = 127.0.0.1

另外的可访问的用户和密码已经在安装软件包时设置过了。

3.设置 Nginx

如果网站运行的是 WordPress(比如我),可以查看 WordPress 的官方 Nginx 配置指导。虽然有官方指导了,我还是简单介绍一下吧,作为笔记。

首先,进入 /etc/nginx/sites-available 目录下,这个目录是用来保存架设在 Nginx 上的虚拟主机配置文件的,所有已启用或未启用的主机配置文件都放在这个目录中。新建一个文件,比如 wordpress,编辑这个文件,在文件中写一个 server 块(一个虚拟主机),大致内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
listen 443 default_server;
listen [::]:443 default_server;

ssl on;
ssl_certificate /path/to/your/certificate;
ssl_certificate_key /path/to/your/certificate;
# ... 其它自定义的配置内容

server_name example.com;
index index.html index.php;
root /var/www/html/example;

include snippets/restruction.conf; # 这里标注一下

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

location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include snippets/fastcgi-php.conf;
# ... 其它自定义的配置内容
fastcgi_pass unix:/path/to/your/php/socket;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}

# ... 其它自定义的配置内容
}

这里的虚拟主机监听 443 端口(https 端口),如果没有证书或者不想使用 https 那就把 443 改成 80,把 ssl 那部分都删掉就行了。如果像让访问者从 http 自动跳转为 https,可以再在以上配置的基础上添加一个 80 端口的虚拟主机,将访问此主机的 http 请求重写为 https。

server_name 是主机的域名(包括主机名),请求传入之后 Nginx 会判断域名并将 URL 交给相应的虚拟主机处理。如 https://test.example.com/index.html 这样的 URL,Nginx 会传递给 server_name 为 test.example.com 的虚拟主机处理。

index 是指当 URI 没有指定访问的文件时,默认访问的文件名。root 是指网站的根目录,即“/”路径所指的目录。

location / {…} 这一段的意思是:当 URI 匹配到 / (根目录)时,尝试 URI 能否访问,若不能,就尝试 URI 后加一个“/”访问,若这两个都不能访问,那么访问“/index.php?$args”这个路径。

location ~ .php$ {…} 这一段用于执行 PHP 脚本,当 URI 匹配到“.php$”(以 php 结尾的 URI)时,就将此请求传递给 PHP FastCGI 进程来运行脚本。

关于配置中所标注的那一句“include snippets/restruction.conf;”,是 WordPress 官方所建议的为 WordPress 或者其他网站所添加的安全配置,添加这个配置可以禁止通过 URL 访问上传的文件,主要是为了防止有人执行使用者上传的脚本文件等。

三、配置完成

配置完成后就可以通过命令启动或重新启动所有服务让设置生效:

1
2
3
sudo service php7.0-fpm start|restart|reload # 启动|重启|重新加载配置
sudo service mysql start|restart|reload # 同上
sudo service nginx start|restart|reload # 同上

这样网站应该就能访问了,如果有提高网站访问速度的需求,可以将网站接入 CDN,这样既提高了访问速度,也增加了一定的安全性。

以上。


LNMP架构网站的搭建
https://maphical.cn/2017/10/setup-lnmp-arch-website/
作者
MaphicalYng
发布于
2017年10月24日
许可协议