debian11部署LNMP(nginx+mariadb+php)教程
前言
LNMP是一种常见的网站开发和运行环境,它由四个主要的软件组成:
- Linux:操作系统,提供基础的运行平台
- Nginx:高性能的Web服务器,负责处理HTTP请求和响应
- MariaDB:开源的关系型数据库管理系统,负责存储和管理数据
- PHP:脚本语言,负责处理业务逻辑和动态内容
在本教程中,我们将使用debian11作为操作系统,编译安装最新版本的nginx、mariadb和php,并且开启一些常用的和必要的模块。我们假设你已经有了一台安装了debian11的服务器,并且可以通过SSH远程登录。
步骤一:安装必要的依赖包
在开始编译安装之前,我们需要先安装一些必要的依赖包,这些包可以帮助我们编译、安装和运行LNMP的各个组件。我们可以使用apt命令来安装这些包,如下所示:
1 | sudo apt update && apt upgrade -y |
这里我们安装了以下几类包:
- build-essential:包含了编译器、链接器等基本的开发工具
- libpcre3、libpcre3-dev:提供了Perl兼容正则表达式的库,用于nginx的rewrite模块
- zlib1g、zlib1g-dev:提供了压缩和解压缩的库,用于nginx的gzip模块
- openssl、libssl-dev:提供了加密和解密的库,用于nginx的ssl模块
- libxml2-dev、libcurl4-openssl-dev:提供了XML解析和HTTP客户端的库,用于php的curl、dom、simplexml等扩展
- libjpeg-dev、libpng-dev、libfreetype6-dev:提供了图像处理的库,用于php的gd扩展
- libmcrypt-dev:提供了加密算法的库,用于php的mcrypt扩展
- libzip-dev:提供了ZIP文件处理的库,用于php的zip扩展
安装完成后,我们可以检查一下这些包是否正确安装:
1 | dpkg -l | grep -E 'build-essential|libpcre3|zlib1g|openssl|libxml2|libcurl4|libjpeg|libpng|libfreetype6|libmcrypt|libzip' |
如果没有报错,就说明这些包都已经成功安装。
要养成把源码包放到/usr/local/src目录下的好习惯
步骤二:下载并编译安装nginx
接下来,我们要下载并编译安装nginx。我们可以从官网下载最新版本的源码包:
1 | wget https://nginx.org/download/nginx-1.24.0.tar.gz |
然后解压缩源码包:
1 | tar zxvf nginx-1.24.0.tar.gz |
进入源码目录:
1 | cd nginx-1.24.0 |
执行configure命令来配置编译选项:
1 | ./configure --prefix=/usr/local/nginx --user=www-data --group=www-data --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre |
这里我们指定了以下几个选项:
- –prefix=/usr/local/nginx:指定了安装目录为/usr/local/nginx
- –user=www-data –group=www-data:指定了运行nginx的用户和组为www-data(如果不存在,则会自动创建)
- –with-http_ssl_module:开启了ssl模块,支持HTTPS协议
- –with-http_gzip_static_module:开启了gzip_static模块,支持压缩静态文件
- –with-http_stub_status_module:开启了stub_status模块,支持查看nginx状态信息
- –with-pcre:使用pcre库支持rewrite模块
如果没有报错,就说明配置成功。然后执行make命令来编译源码:
- 如果你服务器线程够多,可以在make 命令后面加个-j参数,编译会更快,安装也同理,如给四个线程 make -j4 ,或者直接最大线程 make -j$(nproc)
- 如果make 或者make install 出现报错,则:
- 检查你的环境是否安装了需要的依赖包,比如编译工具、库文件等等。可以尝试使用 apt install package 安装相关依赖。
- 检查编译选项中是否有与当前系统不兼容的配置。可搜索相应错误信息来确认具体原因,然后酌情修改编译选项。
1 | make -j$(nproc) |
如果没有报错,就说明编译成功。最后执行make install命令来安装nginx:
1 | sudo make install -j$(nproc) |
如果没有报错,就说明安装成功。我们可以检查一下nginx是否正确安装:
1 | sudo /usr/local/nginx/sbin/nginx -v |
如果输出了nginx的版本信息,就说明nginx已经正确安装。我们可以查看一下nginx的配置文件:
1 | sudo vim /usr/local/nginx/conf/nginx.conf |
这里我们可以看到nginx的默认配置,包括监听端口、日志文件、虚拟主机等。我们可以根据自己的需要修改这些配置,或者添加新的配置。例如,我们可以开启gzip压缩功能,提高网站的性能:
1 | http { |
保存并退出后,我们可以使用以下命令来测试配置文件是否正确:
1 | sudo /usr/local/nginx/sbin/nginx -t |
如果没有报错,就说明配置文件正确。然后我们可以使用以下命令来启动nginx:
1 | sudo /usr/local/nginx/sbin/nginx |
如果没有报错,就说明nginx已经启动。我们可以使用以下命令来查看nginx的进程:
1 | ps aux | grep nginx |
如果看到有一个master进程和几个worker进程,就说明nginx正常运行。我们也可以使用以下命令来查看nginx的状态信息:
1 | curl http://localhost/nginx_status |
如果看到类似以下的输出,就说明nginx状态信息正常:
1 | Active connections: 1 |
至此,我们已经完成了下载并编译安装nginx的步骤。
步骤三:下载并编译安装mariadb
安装前依赖解决
- cmake
- boost
boost Boost库是一个可移植、提供源代码的C库,作为标准库的后备,是C标准化进程的开发引擎之 一
1 | #cmake命令 2.8 以上 |
1 | wget https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz |
接下来,我们要下载并编译安装mariadb。我们可以从官网下载最新版本的源码包:
1 | wget https://mirrors.ustc.edu.cn/mariadb/mariadb-10.10.4/source/mariadb-10.10.4.tar.gz |
然后解压缩源码包:
1 | tar zxvf mariadb-10.10.4.tar.gz |
进入源码目录:
1 | cd mariadb-10.10.4 |
创建build目录,用来放编译后的缓存文件,然后进入build目录:
1 | mkdir build && cd build |
如果cmake 出错或者又需要添加别的库的支持,直接执行
rm -rf *
命令,删除build当前目录下的所有编译文件
执行cmake命令来配置编译选项:
1 | cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \ |
这里我们指定了以下几个选项:
- -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb:指定了安装目录为/usr/local/mariadb
- -DMYSQL_DATADIR=/usr/local/mariadb/data:指定了数据文件的目录为/usr/local/mariadb/data
- -DMYSQL_UNIX_ADDR=/usr/local/mariadb/mysql.sock:指定sock文件路径
- -DWITH_INNOBASE_STORAGE_ENGINE=1:开启了InnoDB存储引擎支持,支持事务和外键等特性
- -DWITH_ARCHIVE_STORAGE_ENGINE=1:开启了Archive存储引擎支持,支持高压缩比的存储
- -DWITH_BLACKHOLE_STORAGE_ENGINE=1:开启了Blackhole存储引擎,支持不存储任何数据的存储
- -DWITH_EMBEDDED_SERVER=1:开启嵌入式服务器支持,可以作为一个嵌入式服务器集成到其他程序中。生成一个libmysqld.a(.so)的库,这个库同时集成了mysql服务与客户端API
- -DENABLED_LOCAL_INFILE=1:开启本地数据导入支持。
- -DWITH_READLINE=1:使用readline库支持命令行编辑和历史记录功能
- -DWITH_LIBWRAP=0:关闭libwrap库的支持,避免编译错误
- -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci :安装所有字符集、默认字符集utf-8 、校验字符
- -DWITH_SSL=system:使用系统自带的openssl库支持加密连接功能
- -DWITH_ZLIB=system:使用系统自带的zlib库支持压缩功能
- -DMYSQL_TCP_PORT=3306:指定了TCP端口号为3306
- -DWITH_BOOST=/usr/local/boost -DBOOST_ROOT=/usr/local/boost :允许下载boost库文件
- -DMYSQL_USER=mysql : 指定了运行mariadb的用户为mysql
以上参数需要和下文
my.cnf
同步(如果你需要修改我的编译参数,记得下文配置文件一并修改)
如果没有报错,就说明配置成功。然后执行make命令来编译源码:
1 | make -j$(nproc) |
如果没有报错,就说明编译成功。最后执行make install命令来安装mariadb:
1 | sudo make install -j$(nproc) |
如果没有报错,就说明安装成功。我们可以检查一下mariadb是否正确安装:
1 | sudo /usr/local/mariadb/bin/mysql --version |
如果输出了mariadb的版本信息,就说明mariadb已经正确安装。
编译并安装完成后,我们需要进行一些配置工作,以确保MariaDB能够正常运行。首先,我们需要创建一个mysql用户和组,并修改MariaDB目录的属主和属组:
1 | sudo groupadd mysql |
然后,我们需要复制初始化脚本到相应的位置,并设置相应的权限:
1 | sudo cp /usr/local/mariadb/support-files/mysql.server /etc/init.d/mysqld |
查看MySQL/MariaDB将要从哪些配置文件中读取默认选项:
1 | mysqld --help --verbose | grep "Default options are read" |
默认情况下会在以下位置读取:
1 /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf $MARIADB_INSTALL_DIR/my.cnf
修改MariaDB配置文件,优化MariaDB
配置文件位于/etc/my.cnf ,没有则创建一个(直接用vim也会自动创建)
1 | sudo vim /usr/local/mariadb/my.cnf |
参考配置示例:
1 | # Begin /etc/mysql/my.cnf |
保存并退出后,我们可以使用以下命令来初始化数据库:
1 | sudo /usr/local/mariadb/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data |
如果没有报错,就说明数据库初始化成功。然后我们可以使用以下命令来启动mariadb:
1 | sudo /usr/local/mariadb/bin/mysqld_safe --user=mysql |
如果没有报错,就说明mariadb已经启动。我们可以使用以下命令来查看mariadb的进程:
1 | ps aux | grep mysqld |
如果看到有一个mysqld_safe进程和一个mysqld进程,就说明mariadb正常运行。我们也可以使用以下命令来登录mariadb:
1 | /usr/local/mariadb/bin/mysql -u root -p |
如果看到类似以下的输出,就说明mariadb登录成功:
1 | Welcome to the MariaDB monitor. Commands end with ; or \g. |
至此,我们已经完成了下载并编译安装mariadb的步骤。
步骤四:下载并编译安装php
接下来,我们要下载并编译安装php。我们可以从官网下载最新版本的源码包:
1 | wget https://www.php.net/distributions/php-8.1.0.tar.gz |
然后解压缩源码包:
1 | tar zxvf php-8.1.0.tar.gz |
进入源码目录:
1 | cd php-8.1.0 |
执行configure命令来配置编译选项:
1 | ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-mysqli=/usr/local/mariadb/bin/mysql_config --with-pdo-mysql=/usr/local/mariadb/bin/mysql_config --with-openssl --with-zlib --with-curl --with-gd --with-jpeg --with-png --with-freetype --enable-gd-jis-conv --with-zip --enable-mbstring |
这里我们指定了以下几个选项:
- –prefix=/usr/local/php:指定了安装目录为/usr/local/php
- –with-config-file-path=/usr/local/php/etc:指定了配置文件的目录为/usr/local/php/etc
- –enable-fpm:开启了fpm模式,支持与nginx配合使用
- –with-fpm-user=www-data –with-fpm-group=www-data:指定了运行php-fpm的用户和组为www-data
- –with-mysqli=/usr/local/mariadb/bin/mysql_config –with-pdo-mysql=/usr/local/mariadb/bin/mysql_config:开启了mysqli和pdo_mysql扩展,支持与mariadb交互
- –with-openssl:开启了openssl扩展,支持加密功能
- –with-zlib:开启了zlib扩展,支持压缩功能
- –with-curl:开启了curl扩展,支持HTTP客户端功能
- –with-gd:开启了gd扩展,支持图像处理功能
- –with-jpeg –with-png –with-freetype:指定了gd扩展使用的图像库
- –enable-gd-jis-conv:开启了gd扩展的日文转换功能
- –with-zip:开启了zip扩展,支持ZIP文件处理功能
- –enable-mbstring:开启了mbstring扩展,支持多字节字符串处理功能
如果没有报错,就说明配置成功。然后执行make命令来编译源码:
1 | sudo make -j$(nproc) |
如果没有报错,就说明编译成功。最后执行make install命令来安装php:
1 | sudo make install -j$(nproc) |
如果没有报错,就说明安装成功。我们可以检查一下php是否正确安装:
1 | sudo /usr/local/php/bin/php -v |
如果输出了php的版本信息,就说明php已经正确安装。我们可以查看一下php的配置文件:
1 | sudo vim /usr/local/php/etc/php.ini |
这里我们可以看到php的默认配置,包括错误报告、内存限制、文件上传、时区等。我们可以根据自己的需要修改这些配置,或者添加新的配置。例如,我们可以开启错误显示功能,方便调试:
1 | [PHP] |
保存并退出后,我们可以使用以下命令来复制php-fpm的配置文件:
1 | sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf |
然后我们可以使用以下命令来启动php-fpm
1 | sudo /usr/local/php/sbin/php-fpm |
如果没有报错,就说明php-fpm已经启动。我们可以使用以下命令来查看php-fpm的进程:
1 | ps aux | grep php-fpm |
如果看到有一个master进程和几个worker进程,就说明php-fpm正常运行。我们也可以使用以下命令来测试php是否能够处理请求:
1 | curl http://localhost/index.php |
如果看到类似以下的输出,就说明php能够处理请求:
1 | Hello, world! |
至此,我们已经完成了下载并编译安装php的步骤。
步骤五:配置nginx和php-fpm的通信
最后,我们要配置nginx和php-fpm的通信,让nginx能够将PHP请求转发给php-fpm处理,并将结果返回给客户端。我们可以使用以下命令来编辑nginx的虚拟主机配置文件:
1 | sudo vim /usr/local/nginx/conf/vhost/default.conf |
这里我们可以添加以下内容:
1 | server { |
这里我们指定了以下几个参数:
- listen 80:指定了监听端口为80
- server_name localhost:指定了服务器名称为localhost
- root /usr/local/nginx/html:指定了网站根目录为/usr/local/nginx/html
- index index.html index.php:指定了默认首页为index.html或index.php
- location ~ .php$:匹配所有以.php结尾的请求
- fastcgi_pass 127.0.0.1:9000:指定了将请求转发给本地9000端口的php-fpm进程
- fastcgi_index index.php:指定了默认PHP文件为index.php
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name:指定了PHP脚本文件的完整路径
- include fastcgi_params:包含了一些通用的fastcgi参数
保存并退出后,我们可以使用以下命令来测试配置文件是否正确:
1 | sudo /usr/local/nginx/sbin/nginx -t |
如果没有报错,就说明配置文件正确。然后我们可以使用以下命令来重载nginx:
1 | sudo /usr/local/nginx/sbin/nginx -s reload |
如果没有报错,就说明nginx已经重载。我们可以使用以下命令来测试nginx是否能够处理PHP请求:
1 | curl http://localhost/index.php |
如果看到类似以下的输出,就说明nginx能够处理PHP请求:
1 | Hello, world! |
至此,我们已经完成了配置nginx和php-fpm的通信的步骤。
步骤六:把所有的服务能通过systemctl来管理启动
为了方便管理和控制我们的LNMP服务,我们可以把它们都注册为systemd的服务单元,这样我们就可以使用systemctl命令来启动、停止、重启、查看状态等操作。我们可以使用以下命令来创建服务单元文件:
创建nginx.service文件
1 | sudo vim /lib/systemd/system/nginx.service |
然后添加以下内容:
1 | #nginx.service |
创建mariadb.service文件
1 | sudo vim /lib/systemd/system/mariadb.service |
然后添加以下内容:
1 | # mariadb.service |
创建php-fpm.service文件
1 | sudo vim /lib/systemd/system/php-fpm.service |
然后添加以下内容:
1 | # php-fpm.service |
这里我们指定了以下几个参数:
- Description:服务的描述信息
- Documentation:服务的文档链接
- After:服务的启动顺序,表示在哪些服务之后启动
- Wants:服务的启动依赖,表示需要哪些服务同时启动
- Type:服务的类型,表示如何启动和停止服务,这里我们使用forking类型,表示服务会创建子进程并返回主进程的PID
- PIDFile:服务的PID文件位置,用于记录主进程的PID,方便管理和控制服务
- ExecStart:服务的启动命令,用于执行服务的主程序或脚本,可以指定一些参数或选项
- ExecStartPre:服务的启动前置命令,用于执行一些准备工作,例如检查配置文件等
- ExecReload:服务的重载命令,用于重新加载配置文件或刷新缓存等,不会中断服务的运行
- ExecStop:服务的停止命令,用于终止服务的运行,通常是发送一个信号给主进程
- PrivateTmp:服务的私有临时目录选项,表示是否为每个服务创建一个独立的/tmp目录,避免文件冲突或泄露等问题
- WantedBy:服务的安装目标,表示在哪些运行级别下启用该服务,这里我们使用multi-user.target,表示在多用户模式下启用该服务
保存并退出后,我们可以使用以下命令来重新加载systemd:
1 | sudo systemctl daemon-reload |
然后给添加的服务给予执行权限:
1 | chmod a+x /lib/systemd/system/nginx.service |
如果没有报错,就说明systemd已经重新加载。然后我们可以使用以下命令来启动、停止、重启、查看状态等操作:
1 | sudo systemctl start nginx # 启动nginx服务 |
如果没有报错,就说明systemctl能够正常管理和控制我们的LNMP服务。我们也可以使用以下命令来设置LNMP服务为开机自启动:
1 | sudo systemctl enable nginx # 设置nginx服务为开机自启动 |
如果没有报错,就说明LNMP服务已经设置为开机自启动。我们可以使用以下命令来查看LNMP服务的开机自启动状态:
1 | sudo systemctl is-enabled nginx # 查看nginx服务是否开机自启动 |
如果输出了enabled,就说明LNMP服务已经开机自启动。
至此,我们已经完成了把所有的服务能通过systemctl来管理启动的步骤。
结语
恭喜你,你已经成功地用debian11来部署了LNMP(nginx+mariadb+php)环境,并且把它们都注册为systemd的服务单元,方便管理和控制。你现在可以使用这个环境来开发和运行你的网站项目了。希望这个教程文档对你有帮助,如果你有任何问题或者建议,可以随时跟我说哦。谢谢你的阅读和支持。😘