一、网站架构简介

LNMP 架构:一种流行的开源 Web 服务器架构,广泛用于部署动态网站,由Linux+Nginx+MySQL(MARIADB)+PHP 组成,主打高性能和高并发处理能力。跟lamp不同的是, PHP 在 LNMP 中是独立进程(PHP-FPM),Nginx 本身不解析 PHP;而 LAMP 中 的PHP 一般是 Apache 的模块。

LAMP架构:即Linux+apache+mysql(mariadb)+php,一种经典的开源 Web 应用架构,广泛用于部署动态网站和 Web 应用。

LNMT架构:即Linux+Nginx+Mariadb+Tomcat,常用于部署高并发、动静分离的 Java Web 应用。该架构利用 Nginx 处理静态资源和反向代理(反代tomcat),Tomcat 运行 Java 业务逻辑,MariaDB 提供数据存储。

LANMP架构:Linux+Apache+Nginx+MySQL(MARIADB)+PHP架构,nginx作为前端反向代理服务,监听 80 或443端口,专门负责处理‌静态文件‌请求,并将动态请求转发给后端的 Apache,有效减轻 Apache 的负载。apache作为后端 Web 服务器,通常监听非标准端口(如 88 端口),专注于处理‌动态 PHP 请求‌,通过模块或 FPM 方式与 PHP 集成。即由 Nginx 处理静态资源(图片、CSS、JS 等),而将动态请求(PHP 脚本)反向代理给 Apache 处理,以提升系统性能并降低内存消耗。此时跟lnmp不同,nginx不再负责处理动态请求了。

不管哪种结构,都可以使用nginx实现负载均衡。

Nginx以其高性能、高并发处理能力和低资源消耗著称。它特别适合处理大量静态文件和高并发的动态请求。Nginx的配置相对灵活,支持多种负载均衡策略和内容缓存机制。

Apache是一个历史悠久的Web服务器软件,拥有丰富的功能和广泛的社区支持。它适用于各种规模的网站和应用,特别是在需要复杂重写规则或模块支持时表现出色。然而,相对于Nginx,Apache在处理高并发请求时可能消耗更多的系统资源。

Tomcat,即apache tomcat,用于部署和运行 Java 动态网页及后端服务,既是 Servlet 容器(执行 Java 代码),也内置 HTTP 服务器功能(可独立处理 Web 请求)

apache,nginx、tomcat并称为网页服务三剑客,应用广泛。

二、软件安装说明

本次的nginx、mariadb、php均安装在/apps目录

本次演示的是使用源码的方式编译安装nginx、mariadb、php。也就是手搓了。。。难度比较大

源码包安装,优点:源码包的可移植性非常好,几乎可以在任何 Linux 系统中安装使用,并且可以按需定制功能;缺点:涉及的软件依赖多,需要自行解决软件依赖问题,并且不同的系统、系统的不同版本千差万别,解决起来非常耗时费力,但颇有挑战性。

源码包编译安装软件三部曲:

1)./configure 配置(生成Makefile),指定各种软件安装的位置,默认会安装到/usr/local/
2)make  编译(根据Makefile进行编译--->生成对应的命令)
3)make  install  创建目录、复制文件...

创建/apps目录:

root@localhost:~# mkdir /apps

三、安装nginx

1、下载并解压nginx安装包

nginx官网:http://nginx.org/,这里下载最新的: nginx-1.31.3

root@localhost:~# curl -O http://nginx.org/download/nginx-1.31.2.tar.gz
root@localhost:~# tar -xf nginx-1.31.2.tar.gz

2、安装各种软件依赖包

root@localhost:~# apt install -y gcc g++ build-essential libgd-dev libgeoip-dev libssl-dev openssl cmake libncurses5-dev libncursesw5-dev bison  pkg-config gnutls-bin libgnutls28-dev default-jdk libboost-all-dev libxml2-dev libcurl4-openssl-dev liblz4-dev liblzo2-dev libsnappy-dev libssl-dev libdb-dev libreadline-dev libbz2-dev libjudy-dev
3、下载pcre

pcre下载地址:https://github.com/PCRE2Project/pcre2/releases

一般情况官方的地址很难打开,建议使用阿里云的,阿里云下载地址:https://mirrors.aliyun.com/exim/pcre/

这里使用的版本:pcre-8.45.tar.gz,解压即可,不用编译安装。这里直接解压在/root目录中

root@localhost:~# tar xf pcre-8.45.tar.gz 
4、编译安装nginx

进入nginx解压的目录,编译安装。

新版本nginx完成configure后生产的Makefile文件中默认会到pcre等源文件自动编译安装。所以只需要准备好 pcre即可,不需要再手动编译安装pcre,编译安装nginx时指定pcre源码路径即可(–with-pcre=pcre源码路径)。OpenSSL、zlib同理。

root@localhost:~# cd nginx-1.31.2
root@localhost:~/nginx-1.31.2# ./configure --prefix=/apps/nginx  --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module  --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module  --with-stream  --with-stream_ssl_module  --with-stream_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_image_filter_module --with-pcre=/root/pcre-8.45
root@localhost:~/nginx-1.31.2# make && make install

nginx部分参数解析:

--prefix=<path>	指定Nginx软件的安装路径。如果未指定,默认为/usr/local/nginx。
--sbin-path=<path>	指定Nginx软件的可执行文件安装路径。此项只能在安装时指定,如果未指定,默认为<prefix>/sbin/nginx/目录。
--conf-path=<path>	指定Nginx软件的配置文件安装路径。如果未指定,默认为<prefix>/conf/目录。
--pid-path=<path>	在nginx.conf中未指定pid指令的情况下。如果未指定,默认为<prefix>/logs/nginx.pid。pid文件中保存着当前运行的Nginx服务的进程号。
--lock-path=<path>	指定nginx.lock文件的路径。nginx.lock是Nginx服务器的锁文件,如果未指定,默认为/var/lock/目录。
--error-log-path=<path>	在nginx.conf中未指定error_log指令的情况下,指定默认的错误日志路径。如果未指定,默认为<prefix>/logs/error.log。
--http-log-path=<path>	在nginx.conf中未指定access_log指令的情况下,指定默认的访问日志路径。如果未指定,默认为<prefix>/logs/access.log。
--user=<user>	在nginx.conf中未指定user指令的情况下,指定默认的Nginx服务器进程的属主用户,即Nginx进程运行的用户。可以理解为那个用户启动Nginx。如果未指定,默认为nobody,表示不限制。
--group=<group>	在nginx.conf中未指定group指令的情况下,指定默认的Nginx服务器进程的属主用户组,即Nginx进程运行的用户组。可以理解为那个用户组的用户启动Nginx。如果未指定,默认为nobody,表示不限制。
--builddir=<path>	指定编译时的目录。
--with-debug	声明启用Nginx的调试日志。
--add-module=<path>	指定第三方模块的路径,用以编译到Nginx服务器中。
--with-poll_module	声明启用poll模块。poll模块是信号处理的一种方法,和下面提到的select模式类似,都是采用轮询方法处理信号。
--without-poll_module	声明禁用poll模块。
--with-select_module	声明启用select信号处理模式。若configure未找到指定其他的信号处理模式,则默认使用select模式。
--without-select_module	声明禁用select信号处理模式。
--with-http_ssl_module	声明启用HTTP的ssl模块,这样Nginx服务器就可以支持HTTPS请求了,这个模块的正常运行需要安装OpenSSL库(在DEBIAN上为libssl)。
--with-http_realip_module	声明启用HTTP的realip模块,默认不启用。
--with-http_addition_module	声明启用HTTP的addition模块,默认不启用。
--with-http_sub_module	声明启用HTTP的sub模块,默认不启用。
--with-http_dav_module	声明启用HTTP的dav模块,默认不启用。
--with-http_flv_module	声明启用HTTP的flv模块,默认不启用。flv模块使得Nginx服务器支持flv流媒体传输。
--with-http_stub_status_module	声明启用Server Status页。默认不启用。
--with-http_perl_module	声明启用HTTP的perl模块。默认不启用。perl模块使得Nginx服务器支持perl脚本的运行。
--with-perl_modules_path=<path>	指定perl模块的路径。
--with-perl=<path>	指定perl执行文件的路径。
--without-http_charset_module	声明禁用HTTP的charset模块。默认启用。
--without-http_gzip_module	声明禁用HTTP的gzip模块。默认启用。使用gzip模块,需要安装zlib库。
--without-http_ssi_module	声明禁用HTTP的ssi模块。默认启用。
--without-http_userid_module	声明禁用HTTP的userid模块。默认启用。
--without-http_access_module	声明禁用HTTP的access模块。默认启用。
--without-http_auth_basic_module	声明禁用HTTP的auth basic模块。默认启用。
--without-http_autoindex_module	声明禁用HTTP的autoindex模块。默认启用。
--without-http_geo_module	声明禁用HTTP的geo模块。默认启用。
--without-http_map_module	声明禁用HTTP的map模块。默认启用。
--without-http_referer_module	声明禁用HTTP的referer模块。默认启用。
--without-http_rewrite_module	声明禁用HTTP的rewrite模块。默认启用。使用rewrite模块,需要安装pcre库。
--without-http_proxy_module	声明禁用HTTP的proxy模块。默认启用。
--without-http_fastcgi_module	声明禁用HTTP的fastcgi模块。默认启用。
--without-http_memcached_module	声明禁用HTTP的memcached模块。默认启用。
--without-http_limit_zone_module	声明禁用HTTP的limit zone模块。默认启用。Limit zone模块主要负责Nginx服务器共享内存的管理。
--without-http_empty_gif_module	声明禁用HTTP的empty gif模块。默认启用。
--without-http_browser_module	声明禁用HTTP的browser模块。默认启用。
--without-http_upstream_ip_hash_module	声明禁用HTTP的upstream ip hash模块。默认启用。
--http-client-body-temp-path=<path>	指定存放HTTP访问客户端请求报文的临时文件的路径。
--http-proxy-temp-path=<path>	启用HTTP的proxy模块后,指定存放HTTP代理临时文件的路径。
--http-fastcgi-temp-path=<path>	启用HTTP的fastcgi模块后,指定存放fastcgi模块临时文件的路径。
--without-http	声明禁用HTTP Server。
--with-mail	声明启用IMAP/POP3/SMTP代理模块。该模块负责Mail代理服务的处理。
--with-mail_ssl_module	声明启用ngx_mail_ssl_module。
--with-cc=<path>	指定C编译器的路径。
--with-cpp=<path>	指定C预处理器的路径。
--with-cc-opt=<options>	为CFLGS变量添加额外的参数,保证Nginx源代码及其模块能够正确编译。比如在FreeBSD系统中,为了在编译Nginx源代码的同时再去编译pcre库,必须使用–with-cc-opt="-I /usr/local/include"声明再比如,为了使用select模块,必须增加系统允许打开的文件描述符的数量,其中一种方法就是使用–with-cc-opt="-D FD_SETSIZE=2048"声明。
--with-ld-opt=<path> 为部分Nginx软件的模块编译指定链接库目录。比如在FreeBSD系统中,为了在编译Nginx源代码的同时编译pcre库,必须使用–with-ld-opt="-L /usr/local/lib"声明。
--with-cpu-opt=<cpu>	为特定的CPU编译Nginx源代码。官方指定的有效值包括:pentium、pentium pro、pentium 3、pentium 4、athlon、opteron、amd 64、sparc 32、sparc 64、ppc 64等。
--with-pcre=<dir>	指定pcre库源代码的路径。这样可以在编译Nginx源代码的同时编译pcre库,而不需要提前安装pcre库。
--without-pcre	禁止Nginx服务器使用pcre库。此设置同时也会禁止HTTP rewrite模块,因为rewrite模块的正常运行必须由pcre库来支持。在解析配置文件的location指令中的正则表达式时,也需要使用pcre库。因此,强烈建议用户不要使用此选项。
--with-pcre-opt=<path>	为pcre库的building指定额外的指令。
--with-md5=<dir>	指定md5库源代码的路径。这样可以在编译Nginx源代码的同时编译md5库,而不需要提前安装md5库。
--with-md5-opt=<options>	为md5库的building指定额外的指令。
--with-md5-asm	声明使用md5库的汇编源代码。
--with-shal=<dir>	指定shal库源代码的路径。这样可以在编译Nginx源代码的同时编译shal库,而不需要提前安装shal库。
--with-shal-opt=<options>	为shal库的building指定额外的指令。
--with-shal-asm	声明使用shal库的汇编源代码。
--with-zlib=<dir>	指定zlib库源代码的路径。这样可以在编译Nginx源代码的同时编译zlib库,而不需要提前安装zlib库。
--with-zlib-opt=<options>	为zlib库的building指定额外的指令。
--with-zlib-asm=<cpu>	针对特殊的CPU声明使用汇编源代码。官方指定的有效值包括:pentium、pentium pro等。
--with-openssl=<dir>	指定OpenSSL库源代码路径。这样可以在编译Nginx源代码的同时编译OpenSSL库,而不需要提前安装OpenSSL库。
--with-openssl-opt=<options>	为OpenSSL库的building指定额外的指令。
5、创建nginx用户、组

创建nginx用户,修改/apps/nginx目录是属主属组为nginx

root@localhost:~# useradd -r -s /sbin/nologin nginx
root@localhost:~# chown nginx.nginx -R /apps/nginx/
6、启动nginx为服务

直接执行nginx命令即可启动。nginx命令放在nginx安装目录下的sbin目录(这里是:/apps/nginx/sbin/)。

root@localhost:~# /apps/nginx/sbin/nginx

浏览器打开:

OK,nginx安装成功。

nginx部分命令:

/apps/nginx/sbin/nginx -s reload  #重新加载nginx服务
/apps/nginx/sbin/nginx -t         #检查配置文件是否有错
/apps/nginx/sbin/nginx -s stop    #停止nginx服务
7、nginx设为服务并启动

直接执行nginx命令管理nginx不方便,将nginx设为服务,方便管理。

/lib/systemd/system/目录下创建nginx.service

root@localhost:~# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target

[Service]
Type=forking
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/apps/nginx/sbin/nginx -s reload
ExecStop=/apps/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置开机启动:

root@localhost:~# systemctl enable nginx

使用systemctl管理nginx服务。前面已经启动了nginx,为了防止冲突异常,执行killall nginx命令先停止nginx服务。

root@localhost:~# killall nginx
root@localhost:~# systemctl start  nginx
root@localhost:~# ss -tnlp | grep nginx
LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=114919,fd=6),("nginx",pid=114918,fd=6))
root@localhost:~# 
8、配置环境变量

为了方便使用nginx命令(存放在nginx安装目录中的sbin目录下,即:/apps/nginx/sbin/),在/etc/profile文件的末尾添加一行:export PATH=/apps/nginx/sbin:$PATH,如下:

root@localhost:~# vim /etc/profile
export PATH=/apps/nginx/sbin:$PATH
root@localhost:~# source /etc/profile

四、安装mariadb数据库

1、下载mariadb安装包

mariadb官网:https://mariadb.com/

阿里云镜像站:https://mirrors.aliyun.com/mariadb

清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn/mariadb/

mariadb数据库安装有二进制包安装、yum安装、源码编译安装等。这里使用:mariadb-13.1.0

使用二进制安装包安装,相对简单【下载、解压、初始化】。使用源码包编译安装【编译、安装、初始化】,编译安装耗时长,比较复杂。

2、创建mysql用户和数据存放目录

创建名为mysql的用户,数据存放目录:/apps/db-data

root@localhost:~# useradd -r -s /sbin/nologin mysql
root@localhost:~# mkdir /apps/db-data 

日志文件:/var/log/mysqld.log

root@localhost:~# touch /var/log/mysqld.log
root@localhost:~# chown mysql.mysql /var/log/mysqld.log
3、安装mariadb数据库
3.1 解压安装

源码编译安装,安装过程比较耗时。

root@localhost:~# tar xf mariadb-13.1.0.tar.gz 
root@localhost:~# cd mariadb-13.1.0
root@localhost:~/mariadb-13.1.0# cmake . -DCMAKE_INSTALL_PREFIX=/apps/mariadb/ \ 
 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ 
 -DMYSQL_DATADIR=/apps/db-data/ \ 
 -DSYSCONFDIR=/etc/ \ 
 -DMYSQL_USER=mysql \ 
 -DMYSQL_TCP_PORT=3306 \ 
 -DWITH_XTRADB_STORAGE_ENGINE=1 \ 
 -DWITH_INNOBASE_STORAGE_ENGINE=1 \ 
 -DWITH_PARTITION_STORAGE_ENGINE=1 \ 
 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 
 -DWITH_MYISAM_STORAGE_ENGINE=1 \ 
 -DWITH_READLINE=1 \ 
 -DENABLED_LOCAL_INFILE=1 \ 
 -DWITH_EXTRA_CHARSETS=all \ 
 -DDEFAULT_CHARSET=utf8 \ 
 -DDEFAULT_COLLATION=utf8_general_ci \ 
 -DEXTRA_CHARSETS=all \ 
 -DWITH_BIG_TABLES=1 \ 
 -DENABLE_DOWNLOADS=1 \
 -DWITH_ZLIB=bundled \
 -DWITH_SSL=bundled \
 -DWITH_DEBUG=0
root@localhost:~/mariadb-13.1.0# make && make install

参数解释:

-DCMAKE_INSTALL_PREFIX:数据库安装目录
-DMYSQL_DATADIR:数据存放目录
-DMYSQL_UNIX_ADDR:Unix Socket 文件的路径
-DSYSCONFDIR:配置文件存放目录
-DMYSQL_USER:运行数据库的用户
-DMYSQL_TCP_PORT:数据库服务端口,一般是3306
-DWITH_XTRADB_STORAGE_ENGINE:是否开启XtraDB存储引擎,1表示开启
-DWITH_INNOBASE_STORAGE_ENGINE:是否开启InnoDB存储引擎,1表示开启
-DWITH_PARTITION_STORAGE_ENGINE:是否启用分区表存储引擎支持,1表示开启
-DWITH_BLACKHOLE_STORAGE_ENGINE:是否启用BLACKHOLE 存储引擎,1表示开启
-DWITH_MYISAM_STORAGE_ENGINE:是否启用MyISAM存储引擎1表示开启
-DWITH_READLINE:是否启用readline 库支持,1表示开启
-DENABLED_LOCAL_INFILE:是否允许使用 `LOAD DATA LOCAL INFILE` 命令导入存放于客户端的数据文件,1表示开启
-DWITH_EXTRA_CHARSETS=all:安装所有扩展字符集
-DDEFAULT_CHARSET=utf8:设置字符集,例如:utf8、utf8mb4
-DDEFAULT_COLLATION=utf8_general_ci:设置字符排序规则
-DEXTRA_CHARSETS=all :指定额外支持的字符集范围,all为所有
-DWITH_BIG_TABLES=1:是否启用大表的支持,1表示开启
-DWITH_DEBUG=0:是否开启调试功能,0不开启,1开启
-DWITH_BOOST=boost :设置下载 boost 要存放的位置。可以提前使用其它方式下载该文件,然后安装程序就会直接使用,而不会再次下载
-DFORCE_INSOURCE_BUILD=ON,是否允许强制在源码目录内部直接编译构建,on或1表示允许
-DENABLE_DOWNLOADS=1:是否允许自动下载缺失的外部依赖文件,1允许
-DWITH_ZLIB=bundled:启用zlib库支持
-DWITH_SSL=bundled:启用SSL库支持

3.2数据库初始化

数据库安装目录:/apps/mariadb,数据库数据存放目录:/apps/db-data ,进入数据安装目录下的scripts目录,执行初始化

root@localhost:~/mariadb-13.1.0# cd /apps/mariadb/scripts/
root@localhost:/apps/mariadb/scripts# ./mariadb-install-db --user=mysql --basedir=/apps/mariadb  --datadir=/apps/db-data --defaults-file=/etc/my.cnf

3.3修改数据库安装目录、数据存放目录属主属组

root@localhost:~# chown -R mysql:mysql /apps/mariadb/
root@localhost:~# chown -R mysql:mysql /apps/db-data/

3.4配置my.cnf文件

数据库的my.cnf配置文件一般在/etc目录中。在前面的编译中设置数据库的socket文件是:/tmp/mysql.sock

my.cnf主要通过”[模块]”来划分配置范围,核心模块包括:

[mysqld]:数据库服务端配置(最核心的配置,比如配置内存、InnoDB、端口等)
[mysql]:客户端命令行工具配置(比如,默认字符集、连接超时等)
[mysqld_safe]:mysqld_safe守护进程配置(比如,日志路径)
[client]:所有客户端工具通用配置(比如,默认端口、用户名等)

·[mysqld]模块核心配置

1)基础服务配置

port:数据库监听端口,默认:3306
servcer-id:数据库唯一标识(主从复制、MGR必须配置,值唯一),默认:0。单机环境可设为1,主从架构主库设为100,从库200、300...等
datadir:数据库数据文件存储路径(含表文件、binlog、redo log等)
socket:本来连接的socket文件路径
character-set-server:数据库默认字符集,默认utf8mb4
collation-server:默认排序规则(区分大小写,支持accent敏感),比如:utf8mb4_0900_ai_ci、utf8mb4_unicode_ci
default-time-zone:数据库默认时区(默认,SYSTEM)
skip-grant-tables:跳过密码,用于忘记数据库密码的情况下使用,重置密码后要删除该参数

2)InnoDB配置

innodb_file_per_table:表空间数据存储方式,设为on表示每个表拥有独立的数据文件
innodb_buffer_pool_size:InnoDB缓冲池大小
innodb_log_file_size:单个redo log文件大小,默认48M,生成环境1-4G
innodb_log_file_in_group:redo log文件组数,默认为2
innodb_flush_log_at_trx_commit:redo log刷盘策略(影响事务安全性与性能),金融支付场景设为1(事务提交即刷盘,不丢数据。其他场景为2(性能更高,仅 OS 崩溃可能丢数据)
innodb_flush_method:数据文件刷盘方式。默认O_DIRECT(Linux),Windows 设为 unbuffered
innodb_max_dirty_pages_pct:缓冲池脏页比例阈值(超过则触发后台刷盘),保持默认 90%,若写入压力大,可降至 75%,减少突发刷盘导致的性能波动
innodb_read_io_threads:InnoDB读IO线程数,默认4,8核及以上CPU设为8-16
innodb_write_io_threads:InnoDB写IO线程数,默认4,8核及以上CPU设为8-16
innode_buffer_pool_size:InnoDB缓冲池(缓存表数据、索引、undo log),默认128M。单机环境建议设为物理内存的50-70%,主从架构可以设为70-80%

3)连接与安全配置

max_connections:最大并发连接数,默认151,根据实际设置,每个连接约占2M物理内存
wait_timeout:非交互连接超时时间(如JDBC连接、超时后台自动关闭),默认28800(8小时),建议设为300-700秒
interactive_timeout:交互连接超时时间(如JDBC连接、超时后台自动关闭),默认28800(8小时),建议设为300-700秒
max_user_connections:单个用户最大连接数,默认0(表示无限),可设为 max_connections 的 10%-20%(如 200),防止恶意连接
default_authentication_plugin:认证插件,默认caching_sha2_password。若旧应用(如 Python 2.x、旧 JDBC 驱动)无法连接,临时改为 mysql_native_password,逐步升级应用
skip_name_resolve:跳过名称解析,它的核心作用是:禁用MySQL对客户端连接的DNS反向解析。设为on,表示跳过DNS解析步骤,只用客户端的IP地址匹配权限表,完成授权验证。

4)日志配置

slow_query_log:是否开启慢查询(记录执行时间超过 long_query_time 的 SQL),on表示开启
slow_query_log_file:慢查询日志文件路径,放在独立目录(如 /data/mysql/logs/slow.log),避免占满系统盘
long_query_time:慢查询阈值(超过此时间的 SQL 被记录),默认2秒。
log_error:错误日志路径
general_log:通用查询日志(记录所有的SQL操作),默认为OFF
log_bin:是否开启二进制日志,默认为off。主库强制设为 ON,从库若需作为其他从库的主库也需开启
binlog_format:binlog格式,例如ROW、STATEMENT、MIXED。默认ROW,复制安全性高
expire_logs_days:binlog自动过期时间,0表示不删除。7表示7天删除。

[mysql]、[client]、[mysqld_safe]模块较为简单。

修改my.cnf

root@localhost:~# vim /etc/my.cnf
[mysqld]
port=3306
socket=/tmp/mysql.sock
user=mysql
server-id=1
datadir=/apps/db-data
basedir=/apps/mariadb
symbolic-links=0
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
innodb_file_per_table=1 
innodb_flush_log_at_trx_commit=1
max_connections=10000
skip_name_resolve=on
#default_authentication_plugin=mysql_native_password
log_error=/var/log/mysqld.log

[mysql]
default-character-set=utf8mb4
socket=/tmp/mysql.sock
auto-rehash #允许通过tab键提示

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.pid
open-files-limit=8192 #每个进程可以打开的文件数量

设置属主属组及权限

root@localhost:~# chown mysql:mysql /etc/my.cnf 
root@localhost:~# chmod 644 /etc/my.cnf 

3.5数据服务文件

mariadb启动服务的文件是在安装目录下的support-files/mysql.server,把它复制到/etc/init.d/目录中,并命名为mariadb,然后添加可执行权限,添加到系统服务管理即可。

root@localhost:/apps/mariadb# pwd
/apps/mariadb
root@localhost:/apps/mariadb# cp support-files/mysql.server /etc/init.d/mariadb
root@localhost:/apps/mariadb# chmod +x /etc/init.d/mariadb
root@localhost:/apps/mariadb# update-rc.d mariadb defaults

启动mariadb

root@localhost:~# systemctl start mariadb

查看一下mariadb数据库进程:

root@localhost:~# ss -tnlp | grep 3306

结果如下:

OK,mariadb数据编译安装完成。但,此时,数据库root用户密码默认并没有设置。

3.6设置环境变量

编译安装的数据库相关命令在/apps/mariadb/bin/目录中,配置环境变量,方便使用。环境变量配置文件:/etc/profile,在该文件的默认添加一行:export PATH=/apps/mariadb/bin:$PATH

root@localhost:~# vim /etc/profile
export PATH=/apps/mariadb/bin:$PATH
root@localhost:~# source /etc/profile

3.7数据库安全设置

执行mariadb-secure-installation命令进行root密码设置。由于前面已经设置了环境变量,所以直接该命令即可。该命令存放在数据库安装目录的bin目录中(即:/apps/mariadb/bin/)

root@localhost:~# mariadb-secure-installation
NOTE: MariaDB is secure by default. Running this script is mostly
      unecessary and it will likely be removed in a future release,
      but it is for now preserved for backwards compatibility.
Enter root user password or leave blank:
Enter current password for root (enter for none): #要求输入密码,由于安装时没有密码,直接回车即可
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n #是否切换到unix_socket,如果设置是,则不能远程登陆,这里输入n,不切换
Change the root password? [Y/n]  y #输入y,设置root密码
New password:                      #输入密码
Re-enter new password:             #确认密码
Remove anonymous users? [Y/n] y    #输入y,清理匿名用户
Disallow root login remotely? [Y/n] y #输入y,禁止root远程登录
Remove test database and access to it? [Y/n] y #输入y,删除测试数据
Reload privilege tables now? [Y/n] y  #输入y,刷新授权表
Cleaning up...
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
root@localhost:~# 

登陆数据库:

root@localhost:~# mysql -uroot -p

如下图:

OK,数据库登陆成功。

五、安装php

php官网:www.php.net,比较难打开。这里已经提前下载好php安装包。这里使用的版本:php-8.5.8.tar.gz

1、安装依赖包

虽然前面已经安装了一大堆依赖包,但是编译安装php的时候还需要安装其他依赖包

root@localhost:~# apt install -y libsqlite3-dev libicu-dev libonig-dev libxslt-dev libzip-dev
2、编译安装php

这里使用最新的8.5.8版本,已经提前下载存放在/root/目录中。php安装在/apps/目录中

root@localhost:~# tar xf php-8.5.8.tar.gz
root@localhost:~# cd php-8.5.8
root@localhost:~/php-8.5.8# ./configure  --prefix=/apps/php-8.5.8  --with-config-file-path=/apps/php-8.5.8/etc/  --with-config-file-scan-dir=/apps/php-8.5.8/etc/conf.d  --with-mysqli=mysqlnd  --with-pdo-mysql=mysqlnd  --with-fpm-user=nginx --with-fpm-group=nginx  --with-zlib  --with-bz2  --with-curl --with-openssl  --with-mhash  --with-pear --with-iconv --with-jpeg --with-zip  --with-gettext --with-xsl  --with-pear  --with-webp  --with-freetype  --enable-mysqlnd  --enable-xml  --enable-bcmath  --enable-shmop  --enable-sysvsem  --enable-mbregex --enable-fpm  --enable-mbstring  --enable-intl --enable-ftp --enable-gd  --enable-sockets  --enable-pcntl  --enable-soap  --enable-opcache  --enable-pdo  --enable-mysqlnd-compression-support  --enable-session 
root@localhost:~# make && make install

php安装参数:

--prefix:设置php安装目录
--with-config-file-path:php配置文件路径
--with-config-file-scan-dir:php额外配置文件路径
--with-mysqli:用来指定PHP使用哪个MySQL原生驱动来访问MySQL数据库。MySQL原生驱动有两种主要的选择:mysqlnd和libmysqlclient(也称为 mysqli)
--with-pdo-mysql:启用 PHP 数据对象(PDO)扩展支持 MySQL 数据库。跟--with-mysqli一样,建议使用mysqlnd
-with-fpm-user:指定PHP-FPM进程应该以哪个用户身份运行,与nginx配合使用时一般设为nginx
--with-fpm-group:设置PHP-FPM 运行时的用户组,与nginx配合使用时一般设为nginx
--with-zlib:启用php对zlib库的支持,zlib 是一个广泛使用的压缩库,它允许你处理 gzip 和 zlib 格式的压缩数据。这对于处理HTTP压缩、文件压缩等功能非常重要
--with-bz2:启用对BZip2压缩的支持。BZip2是一种常用的数据压缩算法,它可以提供比传统的gzip更高的压缩率,但压缩和解压的速度较慢。
--with-curl:启用PHP对curl库的支持,curl是一个非常强大的库,允许你在PHP中执行HTTP请求
--with-openssl:启用PHP对OpenSSL库的支持。OpenSSL是一个强大的安全库,提供了加密和解密功能,以及用于 SSL/TLS 协议的实现。这对于开发需要处理敏感数据(如个人身份信息、信用卡信息等)的 Web 应用非常重要
--with-mhash:启用mhash扩展,mhash 扩展提供了一系列哈希算法的实现
--with-pear:启用 PHPExtension and Application Repository (PEAR) 支持。PEAR 是一个框架和分发系统,用于分发PHP扩展和应用程序。通过启用 PEAR 支持,你可以方便地安装和管理PHP扩展
--with-iconv:启用iconv函数的支持
--with-jpeg:启用jpeg图片支持
--with-zip:启用zip支持
--with-gettext:启用对Gettext函数的支持,Gettext 是一个用于软件国际化的工具,它通过提供一种方法来存储和检索翻译后的文本字符串,使得软件可以根据用户的语言偏好显示相应的翻译文本
--with-xsl:启用xsl支持。XSL (eXtensible Stylesheet Language) 是一种用于将XML文档转换为其他格式(如 HTML)的语言。
--with-pear:启用 PHP Extension and Application Repository (PEAR) 支持。PEAR 是一个框架和分发系统,用于分发 PHP 扩展和应用程序
--with-webp:启用对WebP图像格式的支持的,WebP 是一种支持有损压缩和无损压缩的图像格式,由 Google 开发,旨在提供比JPEG和PNG更好的压缩效果
--with-freetype:启用对FreeType库的支持,这通常用于处理字体文件
--enable-mysqlnd:启用MySQL Native Driver (mysqlnd) 支持。MySQL Native Driver是 PHP用来与 MySQL 数据库进行交互的扩展
--enable-xml:启用XML扩展的支持
--enable-bcmath:启用BC Math扩展。BC Math 扩展提供了任意精度的数学运算功能
--enable-shmop:启用PHP的共享内存操作(Shared Memory Operations)扩展。shmop 扩展允许 PHP 脚本访问共享内存段,这对于需要快速数据交换或在多个进程间共享数据的应用程序非常有用。
--enable-sysvsem:使用System V信号量
--enable-mbregex:启用多字节字符串的正则表达式支持的配置选项,通常与--enable-mbstring 选项一起使用,后者用于启用多字节字符串(mbstring)函数
--enable-mbstring:启用PHP的多字节字符串(mbstring)扩展
--enable-fpm:启用 PHP FastCGI Process Manager (FPM),这是一种用于处理 Web 请求的高性能、可定制的PHP处理方式
--enable-intl:启用PHP的国际化(Internationalization,简称 i18n)和本地化(Localization,简称 l10n)支持。国际化支持允许 PHP 程序能够处理多种语言和区域设置(locale),这对于开发多语言网站或应用程序非常有用
--enable-ftp:启用ftp支持
--enable-gd:启用gd图像库支持,GD 库是一个用于处理图像的库,它允许 PHP 脚本动态创建图像,包括生成缩略图、添加文本、应用滤镜等
--enable-sockets:启用PHP的 sockets 扩展。这个扩展允许 PHP 脚本通过 sockets 协议与其它进程进行通信
--enable-pcntl:启用PHP的进程控制扩展(Process Control extension)。这个扩展提供了对 Unix 信号处理的支持,以及允许脚本执行后台进程等功能
--enable-soap:启用SOAP 扩展。SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在网络上交换信息
--enable-opcache:启用Opcache 扩展。Opcache 是一个用于提高 PHP 性能的扩展,它可以存储预编译的脚本字节码,从而减少脚本的编译时间,提高执行效率
--enable-pdo:启用PHP数据对象(PDO)扩展。PDO 提供了一个统一的数据库访问接口,使得你可以使用相同的代码访问多种数据库
--enable-mysqlnd-compression-support:启用MySQL Native Driver (mysqlnd) 扩展的压缩支持
--enable-session:启用PHP的会话(Session)支持。PHP会话用于在多个页面请求之间存储信息,例如用户登录状态、购物车数据等。
3、修改配置文件

php的三个主要配置文件:php.ini、php-fpm.conf、www.conf

安装php的时候指定了配置文件目录为:/apps/php-8.5.8/etc/

3.1、php.ini文件

php.ini是php运行核心配置文件,把源码包中的php.ini-production文件复制到/apps/php-8.5.8/etc/目录中,并重命名为php.ini

root@localhost:~/php-8.5.8# pwd
/root/php-8.5.8
root@localhost:~/php-8.5.8# cp php.ini-production /apps/php-8.5.8/etc/php.ini

可以使用默认的配置,也可以修改php.ini文件的个别参数:

expose_php = On 的on改成off
post_max_size = 8M的8改成16
upload_max_filesize = 2M的2改成200
max_execution_time = 30的30改成300
max_input_time = 60的60改成300
添加一行:date.timezone = Asia/Shanghai

如下:

root@localhost:~/php-8.5.8# vim /apps/php-8.5.8/etc/php.ini
expose_php = off
post_max_size = 200M
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 200M
date.timezone = Asia/Shanghai

php.ini文件参数解释:

expose_php:设置PHP信息暴露在http头中,on为开启,off关闭
memory_limit:设置内存限制,默认128M,如:memory_limit = 256M,一般情况大于等于post_max_size
post_max_size:post请求数据大小,默认8M,一般情况大于等于upload_max_filesize
upload_max_filesize:设置单个上传文件的大小,默认2M
max_execution_time:脚本执行时间,默认30
max_input_time:输入数据解析时间,默认60
extension_dir:设置php的扩展库路径
disable_functions = exec,passthru,shell_exec,system:禁用exec,passthru,shell_exec,system这些危险的函数
allow_url_fopen = Off: 禁用远程URL包含(除非必要)
expose_php = Off : 隐藏PHP版本信息
extension=openssl:开启openssl扩展支持
opcache.enable=1:开启opcache支持
opcache.memory_consumption:设共享内存池大(单位:MB)的核心配置项,默认值64M。
opcache.interned_strings_buffer:OPcache 用于存储“内嵌字符(Interned Strings),单位 MB,默认值通常4MB 或 8M(取决于PHP版本),专供类名、函数名、常量键等重复字符串去重复用,避免重复分配内存
opcache.max_accelerated_files:是 PHP OPcache 配置项,定哈希表中可缓存脚本文件数量的上,实际生效值会自动向上取整为预设质数集合中的最小质数。取值范围:2000-1000000
opcache.revalidate_freq=2 表每2秒检查一次脚本文件是否更,仅在opcache.validate_timestamps=1 时生效专用于开发环,生产环境使用会导致高频I/O性能下降,不建议使用。
opcache.fast_shutdown:是否开启快速关闭模式,1:开启,0:关闭。

3.2、php-fpm.conf文件

php-fpm.conf是php-fpm进程服务的主配置文件,将php安装目录etc下的php-fpm.conf.default文件复制到当前目录并重命名为php-fpm.conf

root@localhost:~# cd /apps/php-8.5.8/etc/
root@localhost:/apps/php-8.5.8/etc# cp php-fpm.conf.default  php-fpm.conf

如图:

php-fpm.conf配置文件包含全局配置和进程池配置。

php-fpm.conf参数解释:

全局配置([global])

pid:进程id存放位置
erroe_log:日志文件位置
log_level:日志等级,默认notice,等级有:alert, error, warning, notice, debug

进程池配置,比如[www]:

listen:监听地址。比如:127.0.0.1:9000、/tmp/php-cgi.sock。一般用“ip:端口”这种形式即可
listen.backlog:设置PHP-FPM监听队列的长度,比如:50,表示允许最多 50 个连接请求在队列中等待处理。-1表示无限制
user:用户
group:组

3.3、www.conf文件

www.conf是php-fpm进程服务的扩展配置文件。php安装目录/apps/php-8.5.8/etc/php-fpm.d中有一个文件:www.conf.default,将其改名为www.conf

root@localhost:/apps/php-8.5.8/etc# cd php-fpm.d/
root@localhost:/apps/php-8.5.8/etc/php-fpm.d# cp www.conf.default www.conf

如图:

www.conf参数解释:

pm:设置启动时子进程管理方式,dynamic:启动时根据情况创建,至少有一个,static:指定个数,ondemand:不创建。默认是dynamic
pm.max_children:最大进程数,默认是5
pm.start_servers:dynamic模式下的进程数。默认是2
pm.min_spare_servers:最小空闲进程数,默认1
pm.max_spare_servers:最大空闲进程数,默认3
pm.status_path:状态页面的网址。如果没有设置,则无法访问状态页面,默认值:无
slowlog:设置慢日志地址
request_slowlog_timeout:慢日志记录时间
request_terminate_timeout:设定单个请求的最大执行时间。当请求超过该时限,PHP-FPM 会强制终止 worker 进程,防止脚本无限运行导致服务器资源耗尽。必须同步调整Nginx的 fastcgi_read_timeout,确保其值大于等于request_terminate_timeout
4、指定php-fpm处理 Web 请求时使用的操作系统用户和组

web服务使用nginx,且前面已经创建了nginx用户,所以设置php-fpm处理web请求时使用的用户和组均为nginx。该文件为:/apps/php-8.5.8/etc/php-fpm.d/www.conf。如果在编译安装php的时候已经指定了使用nginx,则不需要再修改。

root@localhost:/apps/php-8.5.8/etc/php-fpm.d# vim www.conf
user = nginx
group = nginx
5、php-fpm服务文件

将php解压目录中的sapi/fpm/init.d.php-fpm的文件复制到/etc/rc.d/init.d/目录中

前面安装php的时候解压在/root/目录中

root@localhost:~# cd php-8.5.8/sapi/fpm/
root@localhost:~/php-8.5.8/sapi/fpm# cp init.d.php-fpm  /etc/init.d/
root@localhost:~/php-8.5.8/sapi/fpm# update-rc.d php-fpm defaults

启动php服务:systemctl start php-fpm

设置开机启动:systemctl enable php-fpm

root@localhost:~/php-8.5.8/sapi/fpm# systemctl start php-fpm
root@localhost:~/php-8.5.8/sapi/fpm# systemctl enable php-fpm

如下图:

php安装成功。至此,nginx、maraidb、php编译安装成功。但,nginx并没有与php-fpm联动。

六、防火墙设置

放行80、443、9000、3306端口。这里使用iptables防火墙,需提前安装好(apt install iptables)。

root@localhost:~# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
root@localhost:~# iptables -I INPUT -p tcp --dport 9000 -j ACCEPT
root@localhost:~# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
root@localhost:~# iptables -I INPUT -p tcp --dport 443 -j ACCEPT
root@localhost:~# iptables-save 

由于没有申请域名和ssl证书,所以443端口暂时用不上。

七、nginx与php联动

1、创建网站目录

创建一个网站目录:/apps/web/,属主属组为nginx

root@localhost:~# mkdir /apps/web/
root@localhost:~# chown nginx:nginx /apps/web/
2、创建测试网页文件

网页测试文件:index.php

root@localhost:~# vim /apps/web/index.php
<?php
    phpinfo();
?>
3、修改nginx配置支持php

nginx的配置文件存放目录:/apps/nginx/conf,默认配置文件:/apps/nginx/conf/nginx.conf,这也是nginx的主配置文件。

nginx.conf配置文件主要分四部分:1、全局模块核心配置部分,2、events部分,3、http部分,4、server部分。server部分就是站点配置部分。

每一个server就是一个站点。为方便管理server,因此,将server部分从nginx.conf文件中剥离出来形成单独的文件,并且另存放在新建的/apps/nginx/conf.d目录中,/apps/nginx/conf.d目录用于存放所有的server文件。

创建/apps/nginx/conf.d目录,并设置属主属组为nginx:

root@localhost:~# mkdir /apps/nginx/conf.d
root@localhost:~# chown nginx:nginx /apps/nginx/conf.d

1)主配置文件nginx.conf

root@localhost:~# vim /apps/nginx/conf/nginx.conf
#第1部分:核心配置部分:设置进程用户、进程数量、日志文件、pid文件
user  nginx nginx;      #指定nginx所属的用户和组(虚拟用户),即工具人进程用户,
                        #也就是nginx进程使用哪个用于运行,默认是nginx      
worker_processes  auto; #设置工具人进程(worker进程)数量,即处理用户请求的进程数量,默认是auto,自动
worker_rlimit_nofile 65535; #设置工作进程可以打开的最大文件描述符数量
error_log  /var/log/nginx.error.log notice;  #错误日志文件及收集的类型,默认收集的类型是:notice
pid        /var/run/nginx.pid;     # pid文件

#第2部分:event区域:设置每个进程处理连接数量、iOS模型use epod设置
events {
    use epoll;  #使用epoll的I/O模型,用这个模型来高效处理异步事件,默认已开启
    worker_connections  65535;  #工具人进程可以处理多少个连接(每个工具人进程最大的连接数),理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
}

#第3部分:http区域:7层功能网站配置等
http {
    include       mime.types;  #引用的媒体类型
    default_type  application/octet-stream;  #设置默认媒体类型
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';  #日志格式
    
    #以下部分:指定nginx访问日志,格式叫做main,访问里面记录什么内容
    #使用之前指定的格式即上面log_format  main定义的格式,记录访问日志
    access_log  /var/log/nginx/access.log  main;  
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;
    tcp_nopush     on;  #优化 TCP 数据传输
    keepalive_timeout  65;  #长连接时长,65秒
    client_header_timeout 20s; #客户端发请求头最长时间的参,默认60秒,超时会直接返回408错误并断开连接,主要用来防止慢速头部攻击占用服务器资源
    client_body_timeout 300s; #客户端上传请求体的超时时间,特别适用于POST/PUT等数据上传场景。大文件上传场景建议延长至300秒
    send_timeout 15s;  #Nginx向客户端发送响应数据的超时时间。移动端弱网环境建议缩短至15秒
    connection_pool_size 256;  #连接内存池的预分配大小,默认值为256字。
    client_header_buffer_size 1k; #设初始请求头缓冲区大的指令,默认值通常1。它决定了Nginx最先分配多大内存来存放客户端发来的请求行和头部字段,如果不够用,Nginx会尝试启用更大的备用缓冲区
    large_client_header_buffers 4 8k; #Nginx用来处理超大请求头的备用缓冲池配,默认是4个8KB的缓冲区,当初始小缓冲区不够用时才会启用它来接收客户端的请求头数据
    client_max_body_size 10m;  #设置客户端请求体最大大小,默认只允许 1MB,超过就会返回 413 错误,主要用在文件上传场景
    client_body_buffer_size 256k; #Nginx 用来控制接收请求体数据时内存缓冲区大小的指,它决定数据是直接存在内存里还是写到临时文件中,但不负责限制请求总大小
    client_body_temp_path /apps/nginx/client_body_temp; # Nginx 配置中用于指客户端请求体临时文件存储路
    request_pool_size 4k;  #调整每个请求内存分配大小,主要用于优化内存池的初始分配策略,默认为4k
    output_buffers 4 32k;  #控制静态大文件发送时的内存缓冲区数量与大小
    #postpone_output 1460;  #用于优化 TCP 小包传输的机制,默认1460,但新版的nginx已被tcp_nopush、tcp_nodelay 和 sendfile 等标准指令替代,所以无需再设置
    
    proxy_temp_path /apps/nginx/proxy_temp; #定临时文件的存储根目录
    fastcgi_temp_path /apps/nginx/fastcgi_temp; #Nginx 存储超内存 FastCGI 响应的临时磁盘目录,需手动创建、赋权,并与 fastcgi_cache_path 同分区
    fastcgi_intercept_errors on; #用于控制Nginx如何处理FastCGI后端服务器(如PHP-FPM)返回的错误,on表Nginx将拦截所有从FastCGI后端服务器返回的错误状态码(例如4xx和5xx错误),并将这些错误视为Nginx本身的错误
    gzip on;             #启用动态 Gzip 压缩功
    gzip_min_length 1k; #设置允许压缩的响应内容最小长度(单位:字节)的参数。只有当响应体的大小大于该值时,Nginx 才会对其进行 Gzip 压缩
    gzip_buffers 32 4k; #指压缩后响应数在内存中缓冲块数单块大的指令,格式为 gzip_buffers number size,默认为 32 4k
    gzip_comp_level 6; #gzip压缩级别,默认是1。级别越高压缩率越高,但 CPU 消耗越大。推荐 4-6。1:压缩率低,cpu占用率极低,适用动态API响应、实时性要求高的场景。4-6,压缩率中等,cpu占用率,常规生产环境推荐使用。9:压缩率极高,cpu占用率极高,适用静态文件托管、带宽成本敏感场景
    gzip_http_version 1.1; #gzip的http版本,默认是1.1,一般不需要修改
    gzip_types text/plain  application/x-javascript  text/css  text/htm 
    application/xml;  #需要压缩的文件类型            
    
    #include:文件包含或引用功能,用于在nginx配置文件中调取其他文件
    #引用nginx子配置文件
    include /apps/nginx/conf.d/*.conf;
}

创建日志文件存放目录:/var/log/nginx/

root@localhost:~# mkdir /var/log/nginx/
root@localhost:~# chown nginx:nginx /var/log/nginx/

2)子配置文件(server {})

在/apps/nginx/conf.d/创建一个server文件,名为,php.conf。格式:server {},每一个server就是一个站点。

root@localhost:~# vim /apps/nginx/conf.d/php.conf
server {           
         listen   80;   #端口,默认80        
          server_name  localhost; #域名,由于没有申请域名,所以默认localhost
location / {             
          root   /apps/web; #网站目录             
           index  index.php index.html index.htm;        
 }
location ~ \.php$ {            
            root   /apps/web; #网站目录            
            fastcgi_pass   127.0.0.1:9000; #定义后端服务地址(ip:端口、Unix Socket)            
             fastcgi_index  index.php;   #默认入口文件            
             fastcgi_buffering on; #开启缓存
             fastcgi_buffers 64 64k; #设置缓存大小,64个每个64k,即64*64                  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; #传递变量(如SCRIPT_FILENAME用于脚本定位),是Nginx与 FastCGI服务器(如PHP-FPM)配合处理动态请求时核心配置指令,用于告诉后端服务具体要执行哪个脚本文件。            
             include        fastcgi_params; #加载Nginx预定义的参数集,参数在nginx的安装目录下的/conf/fastcgi_params文件中         
                }
}
4、nginx的fastcgi_params参数

fastcgi_params 是 Nginx 向 FastCGI 后端(如 PHP-FPM)传递请求信息的键值映射配置文件,定义 HTTP 头、URI、客户端地址等如何映射为 FastCGI 参数;核心包括 SCRIPT_FILENAME、QUERY_STRING、REQUEST_METHOD 等 20 行标准配置。

fastcgi_params参数文件存放在nginx安装目录下的conf目录中的fastcgi_params文件,该文件内容默认如下:

root@localhost:~# cat /apps/nginx/conf/fastcgi_params
fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123  
fastcgi_param  REQUEST_METHOD     $request_method; #请求的方法(GET,POST)  
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段,请求的 MIME 类型,例如 application/x-www-form-urlencoded
fastcgi_param  CONTENT_LENGTH     $content_length;  #请求头中的Content-length字段,HTTP 请求体的长度

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称,当前执行的脚本的路径
fastcgi_param  REQUEST_URI        $request_uri;  #REQUEST_URI是请求的原 URI,包括参数。
fastcgi_param  DOCUMENT_URI       $document_uri; #DOCUMENT_URI 是与请求对应的文件路径
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1
fastcgi_param  REQUEST_SCHEME     $scheme;  #请求协议 http/https
fastcgi_param  HTTPS              $https if_not_empty; #是否使用 https

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; #cgi版本,GATEWAY_INTERFACE是CGI规范版本,通常是 CGI/1.1
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;  #nginx 版本号,可修改、隐藏

fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址
fastcgi_param  SERVER_PORT        $server_port; #服务器端口
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200; # 仅PHP可用,如果PHP编译的时候使用了--enable-force-cgi-redirect指令,REDIRECT_STATUS参数应该传输200
root@localhost:~# 

此外,还有其他参数:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name:SCRIPT_FILENAME 是传递给 FastCGI 进程的脚本文件的完整路径,$document_root是Nginx配置中定义的网站根目录,$fastcgi_script_name 是请求的脚本名。
fastcgi_param  PATH_INFO   $path_info:可自定义变量  

一般情况,保持默认即可,不需要修改。

5、重启nginx服务

重启nginx服务

root@localhost:~# systemctl restart nginx

浏览器打开:144.34.203.170,如下图:

OK,至此,nginx、mariadb、php安装成功。由于是源码编译安装,比较耗时,最难的是要自行解决各种软件依赖。由于Linux发行版本各一,软件依赖不一。

linux安装软件的3种方法:源码编译安装、RPM包安装、yum安装。yum安装是最简单的方式,一般情况,建议适用yum安装。centos系统适用yum或dnf命令(例如,yum install 软件、dnf install 软件),ubuntu适用apt命令,例如,apt install 软件。而RPM包安装,同样要自行解决软件依赖问题。

八、搭建wordpress博客

wordpress官网:https://wordpress.org/,中文版:https://cn.wordpress.org/,目前最新版是7.0.2。

1、创建数据库

由于wordpress需要使用数据库,所以需要新建一个数据库,假设数据库名:wpdb,用户:wpadmin,密码:123456

root@localhost:~# mysql -uroot -p       #登录mariadb数据库
MariaDB [(none)]> create database wpdb; #创建名为wpdb的数据库
2、数据库用户授权

给访问wordpress的用户(用户名:wpadmin,密码:123456)授权。

MariaDB [(none)]> grant all on wpdb.* to 'wpadmin'@'localhost' identified by '123456';
MariaDB [(none)]> flush privileges;  #刷新授权表

命令解释:

GRANT <权限类型> ON <数据库>.<表> TO '<用户名>'@'<主机>' 
[IDENTIFIED BY '<密码>'] [WITH GRANT OPTION];

参数解释:

权限:增删改查,all表示所有

主机:表示用户可以从哪里进行登录与使用数据库,localhost表示只能在数据库本地使用。为了确保安全,建议只能本地访问数据库。如果需要远程,可设置ip或ip段或所有(%),如也可以写成:192.168.1.100、172.16.1.%、%,表示该网段可以访问,但%不包含localhost

数据库.表:表示数据库中的表,*.*表示所有的数据库所有的表。这里的wpdb.*,表示wpdb数据库的全部表

IDENTIFIED BY ‘密码’:设置用户密码

WITH GRANT OPTION:允许用户将自身权限授予他人,需谨慎授权。一般不要设置

创建的用户,其信息保存在mysql数据库中的user表。

3、下载解压wordpress

下载地址:https://cn.wordpress.org/download/releases/

windows:下载zip版本,Linux:下载tar.gz版本

root@localhost:~# curl -O https://cn.wordpress.org/wordpress-7.0.2-zh_CN.tar.gz

前面安装nginx的时候,已经创建了一个网站目录/apps/web/,直接把wordpress解压后的全部文件复制到这个目录即可,当然也可以重新建一个目录。

root@localhost:~# rm -f /apps/web/*
root@localhost:~# tar xf wordpress-7.0.2-zh_CN.tar.gz
root@localhost:~# cp -R wordpress/* /apps/web/

修改web目录属主属组:

root@localhost:~# chown -R nginx:nginx /apps/web/
4、安装wordpress

浏览器打开:144.34.203.170

进入wordpress安装流程,点击现在开始:

按实际填好数据库相关信息,这里为了演示,前面创建的数据库信息:数据库名:wpdb,用户:wpadmin,密码:123456。提交后:

运行安装程序:设置站点标题、用户名、密码、邮箱等信息:

安装完成:

点击登录博客后台:

发表第一篇博文:

第一篇博文:

发布成功:

至此,Ubuntu系统搭建wordpress博客成功。

wordpress博客默认的后台地址:ip/wp-admin,为了安全,建议登陆后安装相关插件修改登录后台地址。

九、其他

隐藏web服务类型及版本

隐藏nginx版本,输入一个不存在的网址,会显示nginx版本:

方法1:在nginx主配置文件中的http部分添加一行:server_tokens off,如图:

重启nginx服务:

root@localhost:~# systemctl restart nginx

再打开刚才的网站:

nginx版本号不显示了。但是不能隐藏web服务器类型,还是显示nginx。

方法2:在编译安装nginx前,修改源码。这种可以修改web服务类型、版本号

修改nginx.h文件:修改NGINX_VERSION、NGINX_VER两个参数:

修改NGINX_VERSION、NGINX_VER两个参数:

root@localhost:~# cd nginx-1.31.2
root@localhost:~/nginx-1.31.2# cd src/core/
#define NGINX_VERSION      "1.31.2"   #这就是nginx版本号,可以删除。
#define NGINX_VER          "nginx/" NGINX_VERSION  #这是nginx名称,可以修改
root@localhost:~/nginx-1.31.2/src/core# cd #回到root目录

比如修改成:

修改src/http/ngx_http_header_filter_module.c的static u_char ngx_http_server_string[]参数

static u_char ngx_http_server_string[] = "Server: hello" CRLF;#默认是Server: nginx

修改src/http/ngx_http_special_response.c文件

"<hr><center>hello world</center>" CRLF #默认是nginx

修改src/http/v2/ngx_http_v2_filter_module.c文件

"http2 output header: \"server: hello\"");   #默认是server: nginx

修改保存后,重新编译nginx

注意,前面的nginx安装在/app/nginx目录,所以此次编译也要指定为该目录,进入nginx的源码目录编译nginx:

root@localhost:~# mkdir nginx
root@localhost:~# cd nginx-1.31.2
root@localhost:~/nginx-1.31.2# ./configure --prefix=/apps/nginx  --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module  --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module  --with-stream  --with-stream_ssl_module  --with-stream_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_image_filter_module --with-pcre=/root/pcre-8.45

配置完成后,执行编译命令:make

root@localhost:~/nginx-1.31.2# make

编译完成即可,不用执行安装命令:make install。由于没执行最后的安装命令,所以原/apps/nginx目录中的文件不会受影响。

编译完成后,把新生成的nginx命令替换掉旧的nginx命令即可。

第一次编译安装nginx目录是:/app/nginx,nginx命令存放在/apps/nginx/sbin/,先把旧的nginx命令备份

root@localhost:~/nginx-1.31.2# cd /apps/nginx/sbin/
root@localhost:/apps/nginx/sbin# mv nginx nginx-old

新编译后的nginx命令存放在nginx目录中的objs目录下。

把新编译的nginx命令复制到/apps/nginx/sbin/目录中,并修改属主属组为nginx:

root@localhost:~/nginx-1.31.2# cp objs/nginx /apps/nginx/sbin/
root@localhost:~/nginx-1.31.2# chown nginx:nginx /apps/nginx/sbin/nginx

重新启动nginx

root@localhost:~# systemctl  restart nginx

重新打开一个不存在的网站:144.34.203.170/00

这样把web服务器类型修改了,版本号也隐藏了,别人就不知道你使用什么web服务器、什么版本。