跳到主要内容

[toc]

lnmp平台

1.lnmp简介

LNMP就是Linux+Nginx+MySQL+PHP,Linux作为服务器的操作系统,Nginx作为Web服务器、PHP作为解析动态脚本语言、MySQL即为数据库。

  • Linux作为服务器的操作系统。

  • Nginx作为WebServer服务器。

  • PHP 作为动态解析服务(php)。

  • MySQL作为后端存储数据库服务。

2.fastcgi协议

Nginx服务本身不能处理PHP的请求,用户发起PHP动态请求, Nginx处理过程如下

用户-->http协议-->Nginx-->fastcgi协议-->php-fpm

提示

fastcgi是nginx连接php-fpm之间的协议

nginx结合PHP FastCGI运行原理图

iShot2020-06-2022.31.46

1.用户发起的所有请求会先抵达LNMP架构中的Nginx

2.如果用户请求的是静态内容,则Nginx直接响应并处理

3.如果用户请求的是动态内容,则通过fastcgi协议发送至php-fpm管理进程

4.php-fpm接收到请求后,会派生对应的wrapper线程,来解析用户请求的动态内容

5.如果涉及到查询数据库操作,则需要php先连接数据库,然后进行查询操作(php-mysql)

6.最终由mysql-->php-fpm->fastcgi->nginx->client

3.搭建lnmp平台

3.1 安装nginx

nginx centos rpm包官方下载地址

3.1.1 下载安装包并安装

wget https://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm

yum -y localinstall nginx-1.18.0-1.el7.ngx.x86_64.rpm

3.1.2 创建www用户并把nginx运行用户修改为www

useradd -u www -M -s /sbin/nologin

sed -i.bak '/user nginx;/cuser www;' /etc/nginx/nginx.conf

3.1.3 启动nginx并设置开机自启

systemctl enable nginx && systemctl start nginx

3.2 安装mysql

mysql官方下载地址

3.2.1 下载安装包并安装

wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.20-1.el7.x86_64.rpm-bundle.tar

yum -y localinstall *.rpm

3.2.2 启动mysql并设置开机自启

systemctl enable mysqld && systemctl start mysqld

3.2.3 从/var/log/mysqld.log中找到mysql8的默认roo密码

$ grep 'root@localhost' /var/log/mysqld.log
2020-06-21T00:46:49.942011Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jB6wzV<ZJIG9

3.2.4 修改root密码

mysql8中密码要求为要包含大写字母,小写字母,数字,特殊符号

在MySQL 8.04前,执行:SET PASSWORD=PASSWORD('[新密码]');修改密码

但是MySQL8.0.4开始,这样默认是不行的。因为之前,MySQL的密码认证插件是mysql_native_password,而现在使用的是caching_sha2_password

提示

mysql8.0.20初次修改root密码需要用如下命令

mysql> alter user user() identified by 'Bxb123.com';
Query OK, 0 rows affected (0.00 sec)

查看mysql8.0.20密码策略

mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
validate_password.length  固定密码的总长度;
validate_password.dictionary_file 指定密码验证的文件路径;
validate_password.mixed_case_count  整个密码中至少要包含大/小写字母的总个数;
validate_password.number_count  整个密码中至少要包含阿拉伯数字的个数;
validate_password.policy 指定密码的强度验证等级,默认为 MEDIUM;

关于 validate_password.policy 的取值:
0/LOW:只验证长度;
1/MEDIUM:验证长度、数字、大小写、特殊字符;
2/STRONG:验证长度、数字、大小写、特殊字符、字典文件;

如果需要设置空密码或者简单密码

设置空密码

mysql> UNINSTALL COMPONENT "file://component_validate_password";
Query OK, 0 rows affected (0.00 sec)

mysql> set password='';
Query OK, 0 rows affected (0.00 sec)

设置简单密码

#设置密码的验证强度等级,LOW表示只验证密码长
set global validate_password.policy=LOW;

#设置密码固定密码总长度
set global validate_password.length=4;

3.3 安装php

3.3.1 添加第三方yum源

安装epel源并添加第三方yum源

yum -y install epel-release && \
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

选择要安装的php版本

export phpversion=php73
yum -y install $phpversion-php-fpm $phpversion-php-cli $phpversion-php-bcmath $phpversion-php-gd $phpversion-php-json $phpversion-php-mbstring $phpversion-php-mcrypt $phpversion-php-mysqlnd $phpversion-php-opcache $phpversion-php-pdo $phpversion-php-pecl-crypto $phpversion-php-pecl-mcrypt $phpversion-php-pecl-geoip $phpversion-php-recode $phpversion-php-snmp $phpversion-php-soap $phpversion-php-xml

通过以下命令来获取更多安装信息

yum search php73

安装后的php配置文件路径

/etc/opt/remi/php73

3.3.2 修改php配置文件

编辑文件/etc/opt/remi/php73/php-fpm.d/www.conf修改php运行用户和组为www

sed -i.bak '/^user/c user = www' /etc/opt/remi/php73/php-fpm.d/www.conf && \
sed -i '/^group/c group = www' /etc/opt/remi/php73/php-fpm.d/www.conf

3.3.3 启动php并设置开机自启

systemctl enable php73-php-fpm && systemctl start php73-php-fpm

4.基于lnmp平台搭建wordpress

wordpress中文官网

wordpress下载地址

4.1 nginx配置

编辑wordpress的nginx配置文件/etc/nginx.conf.d/blog.conf

提示

server_name下的index后边必须是 index.php,否则会报错403

cat > /etc/nginx/conf.d/blog.conf <<'EOF'
server {
listen 80;
server_name _;
root /website/wordpress;
index index.php index.html;

location ~ \.php$ {
root /website/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
EOF

wordpress https配置文件

server {
listen 80;
server_name blog.nginx.com;
rewrite (.*) https://$server_name$request_uri redirect;
}

server {
server_name _;
listen 443;
client_max_body_size 20m;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;


location / {
root /website/wordpress;
index index.php index.html;
}

location ~ \.php$ {
root /website/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

文件fastcgi_params

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径

#以下为默认内容
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI document_uri; #与document_uri; #与uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param GATEWAY_INTERFACE CGI/1.1;#cgi 版本
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

#fastcgi_param PATH_INFO $path_info;#可自定义变量

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;

在php可打印出上面的服务环境变量
如:echo $_SERVER['REMOTE_ADDR']

创建网站根目录

mkdir /website

编辑php测试配置文件

cat > /etc/nginx/conf.d/test.conf <<'EOF'
server {
server_name _;
listen 88;
root /tmp;
index index.php index.html;

location ~ \.php$ {
root /tmp;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
EOF

创建info.php测试php是否正常解析

cat > /tmp/info.php <<EOF
<?php
phpinfo();
?>
EOF

注意端口是88

iShot2020-06-2119.02.06

创建mysql.php测试php是否能连接mysql数据库服务

cat > /tmp/mysql.php <<'EOF'
<?php
$servername = "localhost";
$username = "wordpress";
$password = "wordpress";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);

// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connection successful";
?>
EOF

本机测试即可

$ curl 127.0.0.1:88/mysql.php
Connection successful

4.2 下载wordpress安装包并解压至nginx网站根目录

wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar xf latest-zh_CN.tar.gz -C /website
cd /website && chown -R www.www wordpress/

4.3 创建数据库并授权

mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

#mysql8不能直接创建用户授权,需要先创建用户,然后授权
mysql> create user wordpress@'localhost' identified by 'wordpress';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on wordpress.* to wordpress@'localhost';
Query OK, 0 rows affected (0.00 sec)

4.4 浏览器访问IP开始安装

第一步、浏览器访问IP开始安装

点击现在就开始

iShot2020-06-2119.14.50

第二步、填写数据库信息

iShot2020-06-2119.16.16

第三步、开始安装

iShot2020-06-2119.16.43

第四步、配置站点标题、用户名密码、邮箱

iShot2020-06-2119.20.56

第五步、完成安装

iShot2020-06-2119.21.50

第六步、登陆wordpress

iShot2020-06-2119.22.39

登陆后首界面

iShot2020-06-2119.23.17

5.文件上传限制问题

修改php配置文件php.ini

upload_max_filesize = 20M 
post_max_size = 20M

修改nginx配置文件

client_max_body_size 300M;

php.ini 配置对php上传文件大小的影响参数有:

配置项功能
file_uploadsON确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit8M设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
post_max_size8M限制通过POST方法可以接受的信息最大量
upload_max_filesize2M限制PHP处理上传文件最大值,此值必须小于post_max_size值
提示

⚠️post_max_size 值小于 upload_max_filesize 的值,以 post_max_size 的值为准

而对应的 $_FILES 中error对应的错误提示有:

文件上传时产生的错误

0:表示没有发生任何错误,文件上传成功

1:表示上传文件的大小超出了再PHP配置文件中 upload_max_filesize 选项限制的值

2:表示上传文件大小超出了HTML表单中 MAX_FILE_SIZE 选项所指定的值

3:表示文件只被部分上传

4:表示没有上传任何文件