在Debian Buster中配置Lnmp

从脱离一键包至今已有一段时间,在这个过程中积累了不少经验,现总结一手以留未来翻阅。

前言

现在几乎所有的一件包都是采用编译的方案来安装相关套件,虽然其兼容性不错,但仍有些许不足

  • 搭建速度慢,占用资源大。对于小鸡来说,编译的过程需要占用大量的 cpu 和 ram,并且需要一段时间
  • 配置不够灵活。以 PHP 为例,PHP 拥有大量的模块,但是在编译的过程中只能一气呵成,不能灵活增减
    所以,我将会利用 debian 强大的包管理器 APT 来安装相关组件。

环境安装

APT 的使用我就不再赘述,直接放命令出来吧。
apt install nginx php-fpm mariadb-server
这里的 PHP 我使用的是 fpm,当然了,cli 也不是不行,只是我更喜欢用 sock 文件对接的 fpm 罢了。nginx 的配置文件中同样提供了 cli 的配置。
因为 mysql 闭源,被移除了 apt 源,所以这里用 mariadb 代替,它仍然支持 mysql 的登录。

配置 nginx 和 php

这是 nginx 的文件树

[email protected]:/etc/nginx# tree
.
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules-available
├── modules-enabled
│   ├── 50-mod-http-auth-pam.conf -> /usr/share/nginx/modules-available/mod-http-auth-pam.conf
│   ├── 50-mod-http-dav-ext.conf -> /usr/share/nginx/modules-available/mod-http-dav-ext.conf
│   ├── 50-mod-http-echo.conf -> /usr/share/nginx/modules-available/mod-http-echo.conf
│   ├── 50-mod-http-geoip.conf -> /usr/share/nginx/modules-available/mod-http-geoip.conf
│   ├── 50-mod-http-image-filter.conf -> /usr/share/nginx/modules-available/mod-http-image-filter.conf
│   ├── 50-mod-http-subs-filter.conf -> /usr/share/nginx/modules-available/mod-http-subs-filter.conf
│   ├── 50-mod-http-upstream-fair.conf -> /usr/share/nginx/modules-available/mod-http-upstream-fair.conf
│   ├── 50-mod-http-xslt-filter.conf -> /usr/share/nginx/modules-available/mod-http-xslt-filter.conf
│   ├── 50-mod-mail.conf -> /usr/share/nginx/modules-available/mod-mail.conf
│   └── 50-mod-stream.conf -> /usr/share/nginx/modules-available/mod-stream.conf
├── nginx.conf
├── proxy_params
├── scgi_params
├── **sites-available**
│   └── default
├── **sites-enabled**
│   └── default -> /etc/nginx/sites-available/default
├── snippets
│   ├── fastcgi-php.conf
│   └── snakeoil.conf
├── uwsgi_params
└── win-utf

6 directories, 24 files

其中,加粗部分的 sites-enable、sites-available 是有关站点配置文件的目录
enable 目录意为启用,其包含的链接将指向 available(可用),这样就可以方便得控制站点的启停
当然,你也可以不遵循这个原则,nginx 不会报任何错误,只是维护起来可能会遇到些许问题


一般来说 default 文件包含了最标准的配置信息,如 SSL、PHP 等
所以当我们需要建立其他站点时,可以将 default 文件复制一份,再在副本中更改其 hostname 即可
但是当我们兴冲冲地将 PHP 文件放入 root 时,却发现弹出了下载..

Down

这是因为 Nginx 并不知道该怎么处理 PHP 文件,所以只好将 PHP 发还给你
现在,我们需要通过更改配置文件的方式让 Nginx“学会”与 php-fpm 程序沟通并处理 PHP,来输出页面
在大约 56 行的地方,有一串关于 PHP 的配置

# pass PHP scripts to FastCGI server                                                                                    
#                                                                                                                       
#location ~ \.php$ {                                                                                                    
#       include snippets/fastcgi-php.conf;                                                                              
#                                                                                                                       
#       # With php-fpm (or other unix sockets):                                                                         
#       fastcgi_pass unix:/run/php/php7.3-fpm.sock;                                                                     
#       # With php-cgi (or other tcp sockets):                                                                          
#       fastcgi_pass 127.0.0.1:9000;                                                                                    
#}   

这里,我们需要取消 location 与底部括号和中间与当前环境所对应的注释即可
因为我使用的是 php-fpm,所以我需要取消第五行的注释
至于第二行的 fastcgi,不取消的话有个别 PHP 程序会无法运行
完成之后使用systemctl restart nginx来重启 nginx,现在 PHP 就会正常被处理啦

php done

至此,PHP 与 Nginx 的对接已经成功
如果在重启 nginx 后浏览器仍然在尝试下载,请尝试清除浏览器缓存

截图中的 PHP 程序源于项目 Pi-DashBord

配置数据库

在初次使用数据库的时候,我们需要对其进行初始化

mysql_secure_installation

第一步,程序询问你的数据库 root 密码,但是我们是初次配置,root 密码并不存在,留空回车

Enter current password for root (enter for none):

第二步,程序询问是否需要设置 root 密码

Set root password? [Y/n]

第三步,程序询问是否删除匿名用户(这里不删除的话会有安全问题)

Remove anonymous users? [Y/n]

第四步,程序询问是否禁用远程登陆 root 的权限(如果没有闲的没事登 root 的习惯的话,建议禁用)

Disallow root login remotely? [Y/n]

第五步,程序询问是否移除“test”数据库(默认情况下,test 库是允许所有人访问的,这里容易出现安全问题,建议删除)

Remove test database and access to it? [Y/n]

最后,程序询问是否立即 reload 数据库并使配置生效

Reload privilege tables now? [Y/n]

当看到Thanks for using MariaDB!输出时,mariadb 的初始化便到此结束


当我们使用 MySQL 认证登录数据库时,即使密码正确,我们会发现其拒绝访问

access_denied

这是因为 MariaDB 默认并没有启用 MySQL 的认证,所以我们需要手动启用
使用 mysql 或者 mariadb 命令可以进入数据库的 shell
然后执行以下命令

update mysql.user set plugin = 'mysql_native_password' where User='root';   
flush privileges;  
exit

然后,使用systemctl restart mariadb重启数据库程序
现在,再重新登录,就不会被拒绝访问啦

Done_Database

另外,默认 MariaDB 只将 3306 端口绑定在了本地
如果需要更改,可以在/etc/mysql/mariadb.conf.d/50-server.cnf中修改

本文链接:https://blog.ineko.cc/Setup-lnmp-In-Debian_Buster.html
本博客遵循CC BY-NC-SA 3.0协议进行许可.