LNMP环境与应用配置

LNMP简介

LNMP 是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L 指 Linux,N指 Nginx,M一般指 MySQL,也可以指 MariaDB,P 一般指 PHP,也可以指 Perl 或 Python。

一、安装配置MySQL5.7

1.安装MySQL5.7

MySQL下载地址:MySQL :: Download MySQL Community Server (Archived Versions)

复制代码
下载源
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

将下载的MySQL复制到新建的文件夹下,路径为/opt/soft/

复制代码
安装源
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
复制代码
编辑/etc/yum.repos.d/mysql-community.repo,确保5.7 版本enabled=1
复制代码
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

在线安装:
yum clean all
yum install mysql-server

在线安装出现问题1:

解决办法:

shell 复制代码
# 1. 彻底移除已有的 MySQL 安装包和仓库
rpm -qa | grep mysql | xargs rpm -e --nodeps
rm -rf /etc/yum.repos.d/mysql-community*
rm -rf /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql*

# 2. 重新下载并安装 MySQL 5.7 仓库
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
rpm -Uvh mysql57-community-release-el7-11.noarch.rpm

# 3. 手动导入正确的 GPG 密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 4. 安装 MySQL 服务器(跳过 GPG 检查)
yum install -y mysql-community-server --nogpgcheck
复制代码
检查安装的包
rpm -qa | grep mysql

问题解决:

复制代码
编辑/etc/yum.repos.d/mysql-community.repo,确保5.7 版本enabled=1
复制代码
启动MySQL服务:systemctlstart mysqld

自动创建了MySQL用户:

2.MySQL 5.7密码策略

MySQL5.6默认没有密码,可以直接进入,但是MySQL 5.7不行:

修改密码时需要注意,在MySQL5.7的版本中,数据库密码强制要求了密码强度必须包含大小写数字和特殊字符,弱密码不能使用。

复制代码
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。找到root默认密码,然后登录mysql进行修改:
 grep password /var/log/mysqld.log
 
 2025-11-30T09:00:08.259664Z 1 [Note] A temporary password is generated for root@localhost: C_PHUAynG2yc

复制密码,用root账号登录:

复制代码
[root@localhost log]# mysql -u root -p

提示需要修改密码:

复制代码
修改密码:
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '1234.Com';
或者
mysql> set password for 'root'@'localhost'=password('1234.Com');

通过msyql环境变量可以查看密码策略的相关信息:

复制代码
mysql>show variables like '%password%';
复制代码
validate_password_policy:密码策略,默认为MEDIUM策略
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count:数字至少1个
validate_password_special_char_count:特殊字符至少1个

在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略

选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件

validate_password_policy=0

如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:

validate_password=off

3、创建数据库和账号

完成上述配置后,按照正常流程配置远程访问或创建数据库等,本处使用以下方式创建一个远程登录账号且只用于新建的数据库,此处以配置woniunote系统为例:

复制代码
# 创建数据库 woniunote
mysql> create database woniunote character set utf8 collate utf8_general_ci; 
Query OK, 1 row affected (0.00 sec)

# 创建用户 yt@localhost  %表示支持远程连接,密码为1234.Com
mysql> create user yt@'%' identified by '1234.Com';
Query OK, 0 rows affected (0.00 sec)

# 授权用户yt 拥有 woniunote 数据库所有权限
mysql> grant all privileges on woniunote.* to yt@'%';
Query OK, 0 rows affected (0.00 sec)

可以使用以下命令确认用户是否创建成功:

复制代码
mysql> use mysql;
mysql> select User,host,authentication_string from user;
复制代码
如果要删除某个用户,可以使用以下命令:
mysql> drop user yt@localhost;
如果要收回权限,如DELETE或UPDATE或ALL,下述命令收回所有权限:
mysql> REVOKE all ON woniunote.* FROM yt@'%';

4、远程登录数据库

完成上述操作后,重启MySQL服务器,使用Navicat进行远程连接,此时,将只会出现woniunote数据库,用户无法查看其他数据库,按照正常流程,运行woniunote的SQL文件完成数据库的创建。记得让防火墙允许3306端口访问。

创建新连接:

确认之后,出现下图中的错误:

检查MySQL服务是否启动,再检查防火墙是否开放对应的端口号:

成功连接:

运行SQL语句:

出现下面我错误:

修改配置文件:

复制代码
[root@localhost log]# vi /etc/my.cnf

修改前:

修改后,如下图。并且重启MySQL。

执行成功:

二、安装配置PHP

1、安装依赖库

复制代码
#安装依赖包
yum -y install gcc gcc-c++ glibc automake autoconf libtool make
 
#安装依赖库
yum -y install libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel

yum install -y gcc gcc-c++ make sudo autoconf libtool-ltdl-devel gd-devel freetype-devel libxml2-devel libjpeg-devel libpng-devel curl-devel patch libmcrypt-devel libmhash-devel ncurses-devel bzip2 libcap-devel ntp sysklogd diffutils sendmail iptables unzip cmake pcre-devel zlib-devel openssl openssl-devel

上述安装出现错误时直接将错误发给deepseek,按照步骤进行解决即可,我花费了大约两个小时。

2、创建www用户

之前的安装配置,均使用root账户,如果一旦应用系统被攻击成功,那么攻击者将直接拥有root权限,极其危险。所以,建议在配置Web应用时,将整个Web应用程序的各级目录和文件的所有者和组(owner和group)的所有者修改为www这个普通账号。

复制代码
创建www组:groupadd www
-r 代表创建系统级账号
创建系统账号www:useradd -r www -g www

3、安装PHP7.3

PHP历史版本:PHP: Releases

为了兼容woniunote源代码,下载7.3.30版本的PHP。

复制代码
[root@localhost opt]# wget https://www.php.net/distributions/php-7.3.30.tar.gz
复制代码
解压:tar -zxvf php-7.3.30.tar.gz
切换到源代码目录:cd php-7.3.30

配置PHP安装路径和模块(漫长等待):
./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-openssl --with-libxml-dir --with-zlib --enable-mbstring --with-mysqli=mysqlnd --enable-mysqlnd --with-pdo-mysql=mysqlnd --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-sockets --with-curl --enable-maintainer-zts

编译:make    (耗时较长)
测试:make test(此步骤可以不用,耗时也很长,大约有13000多个文件需要进行测试,文件多少取决于安装了哪些模块)
安装:make install  # --prefix=/usr/local/php 指定了PHP的安装路径(很重要)
复制代码
配置PHP安装路径和模块(漫长等待):
./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-openssl --with-libxml-dir --with-zlib --enable-mbstring --with-mysqli=mysqlnd --enable-mysqlnd --with-pdo-mysql=mysqlnd --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-sockets --with-curl --enable-maintainer-zts

4、配置PHP环境

复制代码
复制配置文件(注意文件路径):
cd /usr/local/php
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp /opt/soft/php-7.3.30/php.ini-production /usr/local/php/lib/php.ini

启动php-fpm:
/usr/local/php/sbin/php-fpm

要让Nginx可以访问PHP,运行PHP脚本,必须要启动php-fpm,该进程将启动端口9000进行监听,获取从Nginx发送过来的PHP脚本处理请求,其满足Fast-CGI协议。

复制代码
启动php-fpm:
/usr/local/php/sbin/php-fpm

启动PHP之前,9000端口没有打开:

三、安装配置Nginx(带Lua支持)

1、安装LuaJIT2.0.5

复制代码
cd /opt/soft
wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.1.0-beta3.tar.gz
tar -xzf v2.1.0-beta3.tar.gz
cd LuaJIT-2.1.0-beta3
make && sudo make install

2、安装ngx_devel_kit

NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。

写在前面:配置到后面,发现版本不兼容,重新更换版本。ngx_devel_kit-0.3.3.tar.gz

复制代码
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
tar -zxf v0.3.0.tar.gz
解压即可,无需要配置安装,在编译Nginx指定该目录

3、安装nginx_lua_module

写在前面:配置到后面,发现版本不兼容,重新更换版本。lua-nginx-module-0.10.25.tar.gz

复制代码
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar -zxf v0.10.13.tar.gz
解压即可,无需要配置安装,在编译Nginx指定该目录

4、导入环境变量

复制代码
编辑/etc/profile文件,在末尾添加:
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1
保存并让该脚本生效:
source /etc/profile
运行env | grep LUA,确保环境变量已经生效
复制代码
[root@localhost include]# vi /etc/profile

5、编译安装Nginx

复制代码
下载Nginx
tar -zxf nginx-1.26.3.tar.gz 
cd  nginx-1.26.3/


./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --pid-path=/usr/local/nginx/nginx.pid --with-http_realip_module --add-module=/opt/soft/ngx_devel_kit-0.3.3 --add-module=/opt/soft/lua-nginx-module-0.10.25 --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"

make -j2  #多任务执行编译,加快速度
make install
复制代码
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --pid-path=/usr/local/nginx/nginx.pid --with-http_realip_module --add-module=/opt/soft/ngx_devel_kit-0.3.3 --add-module=/opt/soft/lua-nginx-module-0.10.25 --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
复制代码
make -j2  #多任务执行编译,加快速度  出现错误

make install

6、运行nginx并确认安装成功

先检查防火墙

复制代码
systemctl status firewalld
firewall-cmd --list-all
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

启动nginx:

复制代码
/usr/local/nginx/sbin/nginx
如果需要重启nginx:
/usr/local/nginx/sbin/nginx -s reload

完成上述配置后,就可以直接访问该服务器的80端口了。

注意:

复制代码
带 Lua 的 Nginx一直配置有问题:/usr/local/nginx/sbin/nginx
纯 Nginx(工作正常),即不带 Lua 模块:/usr/local/nginx_plain/sbin/nginx

可以正常访问:

bash 复制代码
启动过程出现巨大问题,一步步根据deepseek的方法寻找解决办法,总结如下:
echo "=== 步骤13:问题解决与总结 ==="

echo "
===========================================
            🎉 问题已解决!
===========================================

📌 问题原因:
1. 带 Lua 模块的 Nginx 在启动时自动加载 Lua 环境
2. Lua 模块试图加载 'resty.core' 模块(OpenResty 专用)
3. 由于我们使用的是标准 LuaJIT,不是 OpenResty 的 LuaJIT
4. 这些 alert 警告实际上阻止了 Nginx 启动

✅ 解决方案:
1. 我们已经成功编译了纯 Nginx(不带 Lua 模块)
2. 纯 Nginx 运行正常,无警告

📁 现有两个 Nginx 版本:
1. 带 Lua 的 Nginx(有问题):/usr/local/nginx/sbin/nginx
   - 大小:9.4M
   - 状态:无法启动(Lua 模块冲突)

2. 纯 Nginx(工作正常):/usr/local/nginx_plain/sbin/nginx
   - 大小:约 1.8M
   - 状态:正常运行中

🔧 后续选择:
方案A:使用纯 Nginx(推荐)
  - 已经正常工作
  - 命令:sudo /usr/local/nginx_plain/sbin/nginx

方案B:修复带 Lua 的 Nginx
  - 需要重新编译,使用正确的 Lua 模块版本
  - 或者安装 OpenResty 替代

方案C:使用 yum 安装官方 Nginx
  - 命令:sudo yum install -y nginx
  - 最简单,但可能版本较旧

🚀 当前推荐操作:
1. 停止所有 Nginx:sudo pkill nginx
2. 启动纯 Nginx:sudo /usr/local/nginx_plain/sbin/nginx
3. 测试:curl http://localhost

📝 管理命令:
  启动:sudo /usr/local/nginx_plain/sbin/nginx
  停止:sudo /usr/local/nginx_plain/sbin/nginx -s stop
  重载:sudo /usr/local/nginx_plain/sbin/nginx -s reload
  测试:sudo /usr/local/nginx_plain/sbin/nginx -t

===========================================
现在你可以选择使用纯 Nginx,或者继续调试 Lua 版本。
建议先使用纯 Nginx 确保服务正常运行。
===========================================
"

四、配置WoniuNote系统

1、创建主目录并复制WoniuNote文件夹

复制代码
创建目录:mkdir -p /www/web
修改目录所有者:chown -R www:www /www/web
解压woniuNote:unzip WoniuNote.zip -d /www/web
重命令文件:mv WoniuNote woniunote
修改文件所有者:chown -R www:www woniunote #确保该目录及其所有子目录和文件均修改了文件所有者为www
修改数据库连接信息:vi /www/web/woniunote/config/database.php #指定正确的数据库连接信息

2、修改nginx.conf完成配置

先将原始nginx.conf文件重命名:

复制代码
cd /usr/local/nginx_plain/conf/
mv nginx.conf nginx.conf.orig

编辑nginx.conf配置文件:

shell 复制代码
worker_processes  1;


events {
    worker_connections  1024;
}

http {

    include     mime.types;
    default_type    application/octet-stream;

    sendfile        on;
    keepalive_timeout   65;


    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /www/web/woniunote/public;
            index  index.php index.html index.htm;
        }

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {
            root html;
        }

        root  /www/web/woniunote/public;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;

                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include     fastcgi_params;
        }
    }
}

3、重启Nginx

复制代码
/usr/local/nginx_plain/sbin/nginx -s reload

4、访问woniunote

访问成功:

页面可以正常访问,但是右侧边栏没有成功加载数据,并且分类导航栏的链接不可用,会出现404NotFound的页面错误。

但是当我点击具体模块时会出现下图错误

5、配置URL地址重写功能

woniunote使用了ThinkPHP开发框架,ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置'URL_MODEL'=>2即可。

在Apache下只需要开启mod_rewrite模块就可以正常访问了,但是Nginx中默认是不支持PATHINFO的,所

以nginx默认情况下是不支持thinkphp的。不过我们可以通过修改nginx的配置文件来让其支持thinkphp。

Apache中的配置文件重写模块如下:

修改nginx.conf的配置文件如下:

shell 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include     mime.types;
    default_type    application/octet-stream;

    sendfile        on;
    keepalive_timeout   65;

    server {
        listen       80;
        server_name  localhost;

        location / {
			if (!-e $request_filename) {
				rewrite ^/(.*)$ /index.php/$1 last;
				break;
			}
        }

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {
            root html;
        }

        root  /www/web/woniunote/public;
        index index.php index.html;

        location ~ \.php {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
			   set $real_script_name $fastcgi_script_name;
		       if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
					set $real_script_name $1;
					set $path_info $2;
			   }
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param SCRIPT_NAME $real_script_name;
			   fastcgi_param PATH_INFO $path_info;
        }
    }
}
复制代码
重新启动Nginx
/usr/local/nginx_plain/sbin/nginx -s reload

​ 其他模块也正常访问

成功,结束!

相关推荐
stone538 分钟前
流段的上游查询
数据库·sql·mysql
Q_Q51100828542 分钟前
python+django/flask+vue的高考志愿咨询系统
spring boot·python·django·flask·node.js·php
摸鱼的后端43 分钟前
nginx systemctl 命令 开机自启
运维·nginx
qq_5486749344 分钟前
Go的env和bashrc的GOROOT配置不同
linux·开发语言·golang
曹牧44 分钟前
Oracle:字段值中含有单引号
数据库·oracle
郝学胜-神的一滴1 小时前
Linux中的alarm函数详解:定时器信号处理指南
linux·服务器·开发语言·c++·程序人生
qing222222221 小时前
非void函数缺少返回值导致的程序崩溃
数据库
Q_Q19632884751 小时前
python+django/flask+vue的电子产品销售系统
spring boot·python·django·flask·node.js·php