LNMP搭建

LNMP:目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件

能够提供静态页面服务,也可以提供动态web服务。

这是一个缩写

L linux系统,操作系统。

N nginx网站服务,也可也理解为前端,提供前端的静态页面服务。同时具有代理以及转发的作用。转发后端请求。转发到PHP。nginx没有处理动态资源的功能,他有可以支持转发动态请求的模块。

M mysql关系型数据库,保存用户的账号和密码。

P PHP是一种功能强大的动态页面的编程语言,负责解释动态网页文件,和nginx以及数据库协同工作。PHP的主要作用就是web开发,前端开发。

工作流程图:

编译安装:

就是用二进制包,进行安装。

为什么不用yum安装,而是用编译安装?

yum安装只是安装了基础的服务模块,其他的模块要想使用,用户要手动重新添加。

编译安装可以自由的指定需要的模块。

企业中:nginx mysql 都是编译安装。

实验操作:

bash 复制代码
#关闭防火墙和安全机制
systemctl stop firewalld        
systemctl disable firewalld
setenforce 0

#安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

#创建运行用户
useradd -M -s /sbin/nologin nginx

#编译安装,make -j 4 的意思是给4个cpu去处理,可以加快速度,但是不能给多,可能会导致cpu消耗过大!!!
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/

cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

make -j 4 && make install   

#优化路径,此步省略可能需要在后面重启服务时输入systemctl daemon-reload
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

#添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target


chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

Unit\]:这个部分定义了服务单元的元数据。 Description: 描述该服务单元的信息,描述为"nginx"。 After: 定义服务单元所依赖的其他单元,这里表示服务需要在网络加载完成之后启动。 \[Service\]:这个部分定义了服务的运行配置。 Type: 指定服务的类型,这里是forking,表示服务是一个后台进程(通常是fork出子进程)。 PIDFile: 指定保存主进程ID的文件路径,Nginx将会把主进程ID写入这个文件,以便Systemd可以追踪和管理进程。 ExecStart: 指定启动服务的命令。这里是启动Nginx的命令/usr/local/nginx/sbin/nginx。 ExecReload: 指定重新加载配置的命令。当执行此命令时,Systemd将发送HUP信号给主进程,Nginx将重新加载配置文件。 ExecStop: 指定停止服务的命令。当执行此命令时,Systemd将发送QUIT信号给主进程,Nginx将优雅地停止服务。 PrivateTmp: 将此项设置为true,表示为服务提供独立的临时目录。 \[Install\]:这个部分定义了服务的安装配置。 WantedBy: 指定服务所属的目标(target),这里是multi-user.target,表示服务在多用户模式下启动。 ```bash #安装Mysql环境依赖包 yum -y install \ ncurses \ ncurses-devel \ bison \ cmake #创建运行用户 useradd -M -s /sbin/nologin mysql #编译安装 cd /opt tar zxvf mysql-boost-5.7.20.tar.gz cd /opt/mysql-5.7.20/ cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 #查看剩余内存,看看是否足够 free -h #清理内存,一定要在指定内存大小的之前使用!!!! echo 1 > /proc/sys/vm/drop_caches //清理内存,一定要在指定内存大小的之前使用!!!! make -j 4 && make install ``` -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \\ #指定mysql的安装路径 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \\ #指定mysql进程监听套接字文件(数据库连接文件)的存储路径 -DSYSCONFDIR=/etc \\ #指定配置文件的存储路径 -DSYSTEMD_PID_DIR=/usr/local/mysql \\ #指定进程文件的存储路径 -DDEFAULT_CHARSET=utf8 \\ #指定默认使用的字符集编码,如utf8 -DDEFAULT_COLLATION=utf8_general_ci \\ #指定默认使用的字符集校对规则 -DWITH_INNOBASE_STORAGE_ENGINE=1 \\ #安装INNOBASE存储引擎 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \\ #安装ARCHIVE存储引擎 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \\ #安装BLACKHOLE存储引擎 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \\ #安装FEDERATED存储引擎 -DMYSQL_DATADIR=/usr/local/mysql/data \\ #指定数据库文件的存储路径 -DWITH_BOOST=boost \\ #指定boost的路径, -DWITH_SYSTEMD=1 #生成便于systemctl管理的文件 ```bash #修改mysql 配置文件 vim /etc/my.cnf [client] port = 3306 socket=/usr/local/mysql/mysql.sock [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES ``` 在\[client\]节中: port: 客户端连接MySQL服务器使用的端口号,默认为3306。 socket: 客户端连接MySQL服务器使用的Unix socket文件路径,默认为/tmp/mysql.sock。 在该配置文件中指定的路径是/usr/local/mysql/mysql.sock。 在\[mysqld\]节中: user: MySQL服务器运行时的用户名,一般设置为mysql。 basedir: MySQL安装目录的路径。 datadir: 存放MySQL数据文件的路径。 port: MySQL服务器监听的端口号,默认为3306。 character-set-server: MySQL服务器使用的默认字符集,这里设置为UTF-8编码(utf8)。 pid-file: 保存MySQL服务器进程ID的文件路径,默认为/var/run/mysqld/mysqld.pid。在该配置文件中指定的路径是/usr/local/mysql/mysqld.pid。 socket: MySQL服务器监听的Unix socket文件路径,默认为/tmp/mysql.sock。在该配置文件中指定的路径是/usr/local/mysql/mysql.sock。 bind-address: MySQL服务器绑定的IP地址,默认为127.0.0.1,这里设置为0.0.0.0表示允许任何IP地址访问MySQL服务器。 skip-name-resolve: 禁用DNS反向解析,可以提高性能,尤其是在有大量连接时。 max_connections: MySQL服务器支持的最大并发连接数,默认为151,这里设置为2048。 default-storage-engine: 设置默认的存储引擎为InnoDB。 max_allowed_packet: 设置MySQL服务器接收的最大数据包大小,默认为4MB,这里设置为16MB。 server-id: 设置MySQL服务器的唯一ID,在主从复制设置中使用。 NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常 STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 NO_AUTO_CREATE_USER 禁止:GRANT创建密码为空的用户 NO_AUTO_VALUE_ON_ZERO mysql中的自增长列可以从o开始。默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错 NO_ZERO_IN_DATE mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告 ERROR_FOR_DIVISION_BY_ZERO 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。默认情况下数据被零除时MysQL返回NULL IPES_AS_CONCAT 将"\|\|"视为字符串的连接操作符而非或运算符,这和oracle数据库是一样的, ANSI QUOTES 启用ANSI QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符 ```bash #更改mysql安装目录和配置文件的属主属组 chown -R mysql:mysql /usr/local/mysql/ chown mysql:mysql /etc/my.cnf #设置路径环境变量 echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile source /etc/profile #初始化数据库,如果不初始化操作,可能会导致数据库密码需要按规则设置 cd /usr/local/mysql/bin/ ./mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data #添加mysqld系统服务 cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ systemctl daemon-reload systemctl start mysqld.service systemctl enable mysqld #修改mysql 的登录密码 mysqladmin -u root -p password "123456" #授权远程登录 mysql -u root -p #授予root用户可以在所有终端远程登录,使用的密码是123456,并对所有数据库和所有表有操作权限 grant all privileges on *.* to 'root'@'%' identified by '123456'; #GRANT: 这是授权语句的关键字,用于授予特定的权限给指定用户。 #ALL PRIVILEGES: 表示授予所有权限,包括SELECT、INSERT、UPDATE、DELETE、CREATE、DROP等。 #*.*: 这是指定数据库和表的位置,其中*表示所有数据库,第一个*表示所有表。 #因此,这个语句授予'root'用户在所有数据库的所有表上的所有权限。 #'root'@'%': 这是授予权限的用户和主机的标识。'root'是用户名,'%'表示任何主机。 #所以,'root'用户可以从任何主机连接并拥有授予的权限。 #IDENTIFIED BY '123456': 这是设置用户'root'的密码为'123456',这样用户在连接时需要提供相应的#密码。 #刷新权限 flush privileges; #如果出现密码不能登陆: [root@localhost mysql]# vim /etc/my.cnf [mysqld] skip-grant-tables #免密登录 mysql -u root -p mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> update user set authentication_string=password('123456') where Host='localhost' and User='root'; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 ``` ```bash #安装php环境依赖包 yum -y install gd \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel #编译安装 cd /opt tar jxvf php-7.1.10.tar.bz2 cd php-7.1.10 ./configure \ --prefix=/usr/local/php \ --with-mysql-sock=/usr/local/mysql/mysql.sock \ --with-mysqli \ --with-zlib \ --with-curl \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-openssl \ --enable-fpm \ --enable-mbstring \ --enable-xml \ --enable-session \ --enable-ftp \ --enable-pdo \ --enable-tokenizer \ --enable-zip free -h echo 1 > /proc/sys/vm/drop_caches make -j 4 && make install ``` --prefix=/usr/local/php: 指定PHP的安装目录为/usr/local/php。 --with-mysql-sock=/usr/local/mysql/mysql.sock: 指定MySQL的Unix socket文件路径,用于与MySQL数据库建立连接。 --with-mysqli: 启用MySQLi扩展,用于支持MySQL数据库。 --with-zlib: 启用Zlib库,用于压缩和解压缩数据。 --with-curl: 启用cURL库,用于支持对URL的操作,如下载文件等。 --with-gd: 启用GD库,用于处理图像。 --with-jpeg-dir: 指定JPEG库的路径,用于GD库对JPEG格式图片的处理。 --with-png-dir: 指定PNG库的路径,用于GD库对PNG格式图片的处理。 --with-freetype-dir: 指定FreeType库的路径,用于GD库对字体的支持。 --with-openssl: 启用OpenSSL库,用于支持SSL加密和HTTPS协议。 --enable-fpm: 启用PHP-FPM(FastCGI Process Manager),用于提供更高效的PHP进程管理和请求处理。 --enable-mbstring: 启用多字节字符串支持,用于处理多字节字符集的操作。 --enable-xml: 启用XML支持,用于处理XML文档和数据。 --enable-session: 启用会话支持,用于在不同页面间保持用户会话状态。 --enable-ftp: 启用FTP支持,用于对FTP服务器进行操作。 --enable-pdo: 启用PDO(PHP Data Objects),用于支持数据库访问的统一接口。 --enable-tokenizer: 启用Tokenizer扩展,用于对字符串进行分词处理。 --enable-zip: 启用Zip扩展,用于对ZIP文件进行操作。 ```bash #路径优化 ln -s /usr/local/php/bin/* /usr/local/bin/ ln -s /usr/local/php/sbin/* /usr/local/sbin/ #调整PHP配置文件 php有三个配置文件: php.ini 主配置文件 php-fpm.conf 进程服务配置文件 www.conf 扩展配置文件 #调整主配置文件: cp /opt/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini vim /usr/local/php/lib/php.ini --1170行--修改 mysqli.default_socket = /usr/local/mysql/mysql.sock --939行--取消注释,修改 date.timezone = Asia/Shanghai #验证安装的模块 php -m #调整进程服务配置文件: cd /usr/local/php/etc/ cp php-fpm.conf.default php-fpm.conf vim php-fpm.conf --17行--去掉";"注释 pid = run/php-fpm.pid #调整扩展配置文件: cd /usr/local/php/etc/php-fpm.d/ cp www.conf.default www.conf 启动php-fpm /usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini netstat -anpt | grep 9000 #PHP-FPM(FastCGI Process Manager:FastCGI 进程管理器)是一个 PHPFastCGI 管理器, 由于Nginx服务器不能处理动态页面,需要由 Nginx 把动态请求交给 php-fpm 进程进行解析。 cd /opt/php-7.1.10/sapi/fpm cp php-fpm.service /usr/lib/systemd/system/php-fpm.service systemctl restart php-fpm.service 配置 Nginx 支持 PHP 解析 --65行--取消注释,修改 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #将 /scripts 修改为nginx的工作目录 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #$document_root 代表当前请求在root指令中指定的值 include fastcgi_params; } FastCGI(Fast Common Gateway Interface)是一种用于连接Web服务器(如Nginx、Apache等) 与应用程序(如PHP、Python、Ruby等)的通信协议。 它的作用是提供一种高效、可靠、灵活的方式来处理动态网页内容的请求, 使Web服务器能够与动态应用程序进行交互。 location ~ \.php$ { ... }:这是一个正则表达式匹配的location块,用于匹配以.php为后缀的请求。 root html;:设置服务器根目录为html,即将从这个目录开始查找文件。 fastcgi_pass 127.0.0.1:9000;:设置FastCGI服务器的地址和端口号。 在这里,FastCGI服务器设置为本地地址(127.0.0.1)的9000端口。通常,这是PHP-FPM的监听地址和端口。 fastcgi_index index.php;:指定当请求目录时默认访问的文件名。 在这里,如果请求目录时,默认访问的文件为index.php。 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;: 设置FastCGI参数SCRIPT_FILENAME的值,指定PHP脚本的文件路径。 $fastcgi_script_name是FastCGI服务器传递给PHP-FPM的变量, 表示当前请求的脚本路径。这里将根目录设置为/usr/local/nginx/html, 以匹配Nginx配置文件中root指令的值。 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;: 这是另一种设置SCRIPT_FILENAME的方式,使用了$document_root变量。 $document_root表示Nginx中root指令指定的值,即服务器根目录。 这里将$document_root$fastcgi_script_name设置为SCRIPT_FILENAME的值, 以便传递给PHP-FPM。 include fastcgi_params;:包含fastcgi_params文件中的FastCGI参数。 这里使用include指令,将fastcgi_params中的内容合并到当前配置中。 #重启服务 systemctl restart nginx.service #验证PHP 测试页 vim /usr/local/nginx/html/index.php #浏览器访问 http://192.168.11.13/index.php #验证数据库工作是否正常 mysql -u root -p CREATE DATABASE bbs; GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123'; GRANT all ON bbs.* TO 'bbsuser'@'localhost' IDENTIFIED BY 'admin123'; flush privileges; GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123'; GRANT: 这是授权语句的关键字,用于授予特定的权限给指定用户。 all: 表示授予所有权限,包括SELECT、INSERT、UPDATE、DELETE、CREATE、DROP等。 bbs.*: 这是指定数据库和表的位置,其中bbs表示数据库名,*表示所有表。 因此,这个语句授予bbsuser用户在bbs数据库的所有表上的所有权限。 'bbsuser'@'%': 这是授予权限的用户和主机的标识。'bbsuser'是用户名,'%'表示任何主机。 所以,bbsuser用户可以从任何主机连接并拥有授予的权限。 IDENTIFIED BY 'admin123': 这是设置bbsuser用户的密码为admin123,这样用户在连接时需要提供相应的密码。 GRANT all ON bbs.* TO 'bbsuser'@'localhost' IDENTIFIED BY 'admin123'; 这条语句与第一条类似,但是主机部分不同。'bbsuser'@'localhost'表示用户bbsuser只能从本地主机( 即MySQL服务器所在的主机)连接,并拥有相同的权限。 bbsuser用户被授予在bbs数据库的全部权限,允许从任何主机和本地主机连接MySQL服务器,并且密码为admin123. #替换原来的测试页内容 vim /usr/local/nginx/html/index.php Success!!"; else echo "Fail!!"; ?> PHP脚本 使用mysqli_connect()函数连接到MySQL数据库服务器。 '192.168.11.13':表示MySQL服务器的IP地址。 'bbsuser':表示要连接的MySQL用户。 'admin123':表示MySQL用户的密码。 判断连接状态: 如果连接成功,即$link不为空,就输出

Success!!

,显示"Success!!"这个标题。 如果连接失败,即$link为空,就输出Fail!!,显示"Fail!!"这个信息。 : 该脚本的目的是测试连接到MySQL数据库服务器的状态。如果连接成功, 将显示"Success!!",如果连接失败,将显示"Fail!!" 浏览器访问 http://192.168.11.13/index.php #论坛部署 cd /opt unzip Discuz_X3.4_SC_UTF8.zip -d /opt/dis cd /opt/dis/dir_SC_UTF8/ cp -r upload/ /usr/local/nginx/html/bbs/ #调整论坛目录的权限: cd /usr/local/nginx/html/bbs/ chown -R nginx ./config/ chown -R nginx ./data/ chown -R nginx ./uc_client/ chown -R nginx ./uc_server/ 或 chmod -R 777 ./config/ chmod -R 777 ./data/ chmod -R 777 ./uc_client/ chmod -R 777 ./uc_server/ #论坛页面访问 http://192.168.11.13/bbs/install/index.php 数据库服务器:localhost #不是本地就要写ip地址和端口号 数据库名字:bbs 数据库用户名:bbsuser 数据库密码:admin123 管理员账号:admin 管理员密码:admin123 ```

相关推荐
wdxylb4 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20075 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪5 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk8 小时前
Linux 正则表达式
linux·运维
Fireworkitte9 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9009 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char9 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘1211 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记14 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发14 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建