标签 MySQL 下的文章

Django数据库

MySQL驱动程序安装

使用 Django 来操作 MySQL ,实际上底层还是通过 Python 来操作的。因此想要用 Django 来操作 MySQL ,首先还是需要安装一个驱动程序。

在 Python3 中,驱动程序有多种选择。比如有 pymysql 以及 mysqlclient 等。这里我们就使用 mysqlclient 来操作。

mysqlclient 安装非常简单

pip install mysqlclient

配置连接数据库

在操作数据库之前,首先要连接数据库,这里以配置 MySQL 为例。

Django 连接数据库,不需要单独的创建一个连接对象。只需要在 settings.py 文件中找到DATABASES字段做好数据库相关的配置就可以了。

DATABASES = {
    "default": {
        # 数据库引擎(是mysql还是oracle等)
        "ENGINE": "django.db.backends.mysql",
        # 数据库的名字
        "NAME": "database_django",
        # 连接mysql数据库的用户名
        "USER": "root",
        # 连接mysql数据库的密码
        "PASSWORD": "root",
        # mysql数据库的主机地址
        "HOST": "127.0.0.1",
        # mysql数据库的端口号
        "PORT": "3306",
    }
}

其中 engine 的选择还有以下:

'django.db.backends.postgresql'

'django.db.backends.mysql'

'django.db.backends.sqlite3'

'django.db.backends.oracle'

在Django中操作数据库

在 Django 中操作数据库有两种方式。第一种方式就是使用原生 sql 语句操作,第二种就是使用 ORM 模型来操作。

本笔记记录使用ORM 模型来操作,这里稍微记录一下原生 sql 语句操作

在 Django 中使用原生 sql 语句操作其实就是使用 python db api 的接口来操作。如果你的 mysql 驱动使用的是 pymysql ,那么你就是使用 pymysql 来操作的,只不过 Django 将数据库连接的这一部分封装好了,我们只要在 settings.py 中配置好了数据库连接信息后直接使用 Django 封装好的接口就可以操作了。

# 使用django封装好的connection对象,会自动读取settings.py中数据库的配置信息
from django.db import connection

# 获取游标对象
cursor = connection.cursor()
# 拿到游标对象后执行sql语句
cursor.execute("select * from book") 
# 获取所有的数据
rows = cursor.fetchall()
# 遍历查询到的数据
for row in rows:
    print(row)

以上的 execute 以及 fetchall 方法都是 Python DB API 规范中定义好的。

ORM模型介绍

ORM ,全称 Object Relational Mapping ,中文叫做对象关系映射,通过 ORM 我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性, ORM
在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。

创建ORM模型

ORM 模型一般都是放在 appmodels.py 文件中。每个 app 都可以拥有自己的模型。

并且如果这个模型想要映射到数据库中,那么这个 app 必须要放在 settings.pyINSTALLED_APP 中进行安装。

以下是写一个简单的书籍 ORM 模型。

# 从Django的 django.db 模块中导入了 models 模块
# models 模块包含了用于定义各种数据库字段类型和模型的类
from django.db import models

# 定义了一个名为 Book 的类,并继承自 models.Model
# 继承 models.Model 表示这个类是一个Django模型,将映射到数据库中的一个表
class Book(models.Model):
    # 包含四个字段:name、author、pub_time 和 price
    name = models.CharField(max_length=20,null=False)     
    author = models.CharField(max_length=20,null=False)     
    pub_time = models.DateTimeField(auto_add_now=True)     
    price = models.FloatField(default=0)

以上便定义了一个模型。

这个模型继承自 django.db.models.Model,如果这个模型想要映射到数据库中,就必须继承自这个类。这个模型以后映射到数据库中,表名是模型名称的小写形式,为 book 。

在这个表中,有四个字段,还有一个字段没有写,就是主键 id ,在 django 中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的 int 类型的主键,并且这个主键的名字就叫做 id

映射模型到数据库中

将 ORM 模型映射到数据库中,总结起来就是以下几步:

1.在 settings.py 中,配置好 DATABASES ,做好数据库相关的配置。

2.在 app 中的 models.py 中定义好模型,这个模型必须继承自 django.db.models 。

3.将这个 app 添加到 settings.pyINSTALLED_APP 中的末尾。

INSTALLED_APPS = [
    ...
    "django.contrib.messages",
    "django.contrib.staticfiles",
    # 
    "APP 名称",
]

4在命令行终端,进入到项目所在的路径,然后执行命令 python manage.py makemigrations 来生成迁移脚本文件。

5.同样在命令行中,执行命令 python manage.py migrate 来将迁移脚本文件映射到数据库中。

模型常用Field和参数

在 Django 中,定义了一些 Field 来与数据库表中的字段类型来进行映射。

在Django模型中,字段用于定义模型的属性,代表数据库表中的列。

每个字段代表一个特定的数据类型,并定义可以存储在相应列中的数据类型。

Django提供了多种字段类型来处理不同的数据类型和约束。

常用字段的示例:

from django.db import models

# CharField类
class Book(models.Model):
    title = models.CharField(max_length=100)  # 存储书名的字段(最大长度:100个字符)

# IntegerField类
class Student(models.Model):
    age = models.IntegerField()  # 存储学生年龄的字段

# FloatField类
class Product(models.Model):
    price = models.FloatField()  # 存储产品价格的字段

# DateField类
class Event(models.Model):
    event_date = models.DateField()  # 存储事件日期的字段

# DateTimeField类
class Post(models.Model):
    pub_date = models.DateTimeField()  # 存储帖子发布日期和时间的字段

# BooleanField类
class Task(models.Model):
    is_completed = models.BooleanField()  # 存储任务完成状态的字段

# ForeignKey类
class Author(models.Model):
    name = models.CharField(max_length=100)
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)  # 外键字段,建立一对多关系

# ManyToManyField类
class Course(models.Model):
    name = models.CharField(max_length=100)
class Student(models.Model):
    name = models.CharField(max_length=100)
    courses = models.ManyToManyField(Course)  # 多对多字段,建立多对多关系

# EmailField类
class Contact(models.Model):
    email = models.EmailField()  # 存储联系人电子邮件地址的字段

# ImageField类
class UserProfile(models.Model):
    profile_picture = models.ImageField(upload_to='profile_pics/')  # 存储用户个人资料图片的字段

常用字段

AutoField:

映射到数据库中是 int 类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做 id 的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用 AutoField 也是可以的。

BigAutoField:

64位的整形,类似于 AutoField ,只不过是产生的数据的范围是从 1-9223372036854775807 。

BooleanField:

在模型层面接收的是 True/False 。在数据库层面是 tinyint 类型。如果没有指定默认值,默认值是None

CharField:

在数据库层面是 varchar 类型。在 Python 层面就是普通的字符串。这个类型在使用的时候必须要指定最大的长度,也即必须要传递 max_length 这个关键字参数进去。

DateField:

日期类型。在 Python 中是 datetime.date 类型,可以记录年月日。在映射到数据库中也是 date 类型。使用这个 Field 可以传递以下几个参数:

auto_now :在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段,可以将这个属性设置为 True

auto_now_add :在每次数据第一次被添加进去的时候,都使用当前的时间。比如作为一个记录第一次入库的字段,可以将这个属性设置为 True

DateTimeField:

日期时间类型,类似于 DateField 。不仅仅可以存储日期,还可以存储时间。映射到数据库中是datetime 类型。这个 Field 也可以使用 auto_nowauto_now_add 两个属性。

TimeField:

时间类型。在数据库中是 time 类型。在 Python 中是 datetime.time 类型。

EmailField:

类似于 CharField 。在数据库底层也是一个 varchar 类型。最大长度是254个字符。

FileField:

用来存储文件的

ImageField:

用来存储图片文件的

FloatField:

浮点类型。映射到数据库中是 float 类型。

IntegerField:

整形。值的区间是 -2147483648—2147483647 。

BigIntegerField

大整形。值的区间是 -9223372036854775808—9223372036854775807 。

PositiveIntegerField:

正整形。值的区间是 0—2147483647 。

SmallIntegerField:

小整形。值的区间是 -32768—32767 。

PositiveSmallIntegerField:

正小整形。值的区间是 0—32767 。

TextField:

大量的文本类型。映射到数据库中是longtext类型。

UUIDField:

只能存储 uuid 格式的字符串。 uuid 是一个32位的全球唯一的字符串,一般用来作为主键。

URLField:

类似于 CharField ,只不过只能用来存储 url 格式的字符串。并且默认的 max_length200

Field的常用参数

在Django模型中初始化字段时,可以使用各种参数来自定义字段的行为。每个参数都有特定的目的,并允许您定义字段的特性和约束。

以下是初始化字段时使用的一些常见参数:

from django.db import models

# max_length:指定字段的最大长度
# min_length:指定字段的最低长度
class Book(models.Model):
    title = models.CharField(max_length=100, min_length=1)

# null:确定字段是否可以存储NULL值
class Student(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField(null=True)

# blank:指示字段是否允许为空
class Article(models.Model):
    title = models.CharField(max_length=100, blank=True)

# default:为字段设置默认值
class Order(models.Model):
    order_number = models.CharField(max_length=10, default="0000")

# choices:为字段提供选项列表
GENDER_CHOICES = [
    ('M', 'Male'),
    ('F', 'Female'),
    ('O', 'Other'),
]
class Person(models.Model):
    name = models.CharField(max_length=100)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

# primary_key:指示字段是否为模型的主键
class UserProfile(models.Model):
    user_id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100)

# unique:指定字段的值必须在所有模型实例中唯一
class Product(models.Model):
    product_code = models.CharField(max_length=10, unique=True)

# verbose_name:为字段设置一个人类可读的名称
class Car(models.Model):
    make = models.CharField(max_length=100, verbose_name="Car Make")

# help_text:为字段提供额外的描述性文本
class Employee(models.Model):
    name = models.CharField(max_length=100, help_text="Employee's full name")

# validators:允许您为字段指定验证器列表
from django.core.validators import MinValueValidator, MaxValueValidator
class Score(models.Model):
    score = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])

# upload_to:与ImageField一起使用,指定上传文件的目录
class UserProfile(models.Model):
    name = models.CharField(max_length=100)
    profile_pic = models.ImageField(upload_to='profile_pics/')

# db_index:指示字段是否应该有数据库索引以加快查询速度
class Person(models.Model):
    name = models.CharField(max_length=100, db_index=True)

# editable:确定字段在表单和admin接口中是否可编辑
class Task(models.Model):
    task_name = models.CharField(max_length=100, editable=False)

# db_column: 重命名当前字段,保存到数据时不使用name,而使用tag_name作为表的字段名    
class Tag(models.Model):    
    name = models.CharField(max_length=20,db_column="tag_name")

max_length:指定字段的最大长度。这个参数适用于如CharFieldCommaSeparatedIntegerField这样的字段。

null:确定字段是否可以在数据库中存储NULL值。如果设置为True,则字段可以是NULL的;如果设置为False,则字段将有一个必填值。在使用字符串相关的Field (CharField / TextField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值 False

blank:指示字段是否允许为空(即,包含一个空值)。如果设置为True,则字段可以为空;如果设置为False,则字段必须有一个值。这个和 null 是有区别的, null 是一个纯数据库级别的。而 blank 是表单验证级别的。

default:为字段设置默认值。如果在创建对象时没有提供值,则将使用默认值。可以为一个值,或者是一个函数,但是不支持 lambda 表达式。并且不支持列表/字典/集合等可变的数据结构。

choices:为字段提供选项列表。这个参数与如CharFieldIntegerField这样的字段一起使用,以限制可能的值。

primary_key:指示字段是否为模型的主键。只能有一个字段被设置为主键。

unique:指定字段的值必须在所有模型实例中唯一。

verbose_name:为字段设置一个人类可读的名称。这在表单或admin接口中显示字段时用作标签。

help_text:为字段提供额外的描述性文本。当用户与字段交互时,此文本显示为工具提示或提示。

validators:允许您为字段指定验证器列表。验证器是验证字段值的函数。

upload_to:与ImageField一起使用,以指定上传文件应存储的目录。

db_index:指示字段是否应该有数据库索引以加快

editable:确定字段在表单和admin接口中是否可编辑。这对于不应该在admin界面中更改的字段(如自动生成的字段)很有用。

db_column:这个字段在数据库中是表下的字段的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。

这些参数为Django模型中的字段行为提供了灵活性和控制。通过适当使用这些参数,您可以根据特定要求和约束定制字段。

更多 Field 参数详情可以参考官方文档:https://docs.djangoproject.com/zh-hans/5.0/ref/models/fields/

模型中Meta配置

对于一些模型级别的配置。我们可以在模型中定义一个类,叫做 Meta 。然后在这个类中添加一些类属性来控制模型的作用。

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")     
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:         
        db_table = 'book_model'         
        ordering = ['pub_date']

db_table:这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名

ordering:设置在提取数据的排序方式,比如我想在查找数据的时候根据添加的时间排序

模型 Meta 选项官方文档:https://docs.djangoproject.com/zh-hans/5.0/ref/models/options/

外键和表关系

外键

在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam 。如果使用的是 InnoDB 引擎,是支持外键约束的。外键的存在使得 ORM 框架在处理表关系的时候异常的强大。

外键在 Django 中的使用,类定义为 class ForeignKey(to,on_delete,**options) 。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADESET_NULL等。

这里以一个实际案例来说明。比如有一个 User 和一个 Article 两个模型。一个 User可以发表多篇文章,一个 Article 只能有一个 Author,并且通过外键进行引用。那么相关的示例代码如下:

class User(models.Model):
    username = models.CharField(max_length=20)     
    password = models.CharField(max_length=100)

class Article(models.Model):     
    title = models.CharField(max_length=100)     
    content = models.TextField()

    author = models.ForeignKey("User",on_delete=models.CASCADE)

以上使用 ForeignKey 来定义模型之间的关系。即在 article 的实例中可以通过 author 属性来操作对应的 User 模型。这样使用起来非常的方便。

article = Article(title='abc',content='123') 
author = User(username='张三',password='111111') 
article.author = author 
article.save()

# 修改article.author上的值
article.author.username = '李四'
article.save()

使用了 ForeignKey 后,就能通过 author 访问到对应的 user 对象的原因,是因为在底层, Django 为Article 表添加了一个 属性名_id 的字段(比如author的字段名称是author_id),这个字段是一个外
键,记录着对应的作者的主键。以后通过 article.author 访问的时候,实际上是先通过 author_id 找到对应的数据,然后再提取 User 表中的这条数据,形成一个模型。
如果想要引用另外一个 app 的模型,那么应该在传递 to 参数的时候,使用 app.model_name 进行指定。以上例为例,如果 UserArticle 不是在同一个 app 中,那么在引用的时候的示例代码如下:

# User模型在user这个app中
class User(models.Model):
    username = models.CharField(max_length=20)     
    password = models.CharField(max_length=100)

# Article模型在article这个app中
class Article(models.Model):     
    title = models.CharField(max_length=100)     
    content = models.TextField()

    author = models.ForeignKey("user.User",on_delete=models.CASCADE)

如果模型的外键引用的是本身自己这个模型,那么 to 参数可以为 'self' ,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时
候就需要使用外键来引用自身。示例代码如下:

class Comment(models.Model):
    content = models.TextField()
    origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
    # 或者
    # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)

外键删除操作

如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过 on_delete 来指定。可以指定的类型如下:

CASCADE :级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。

PROTECT :受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。

SET_NULL :设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。

SET_DEFAULT :设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。

SET() :如果外键的那条数据被删除了。那么将会获取 SET 函数中的值来作为这个外键的值。 SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。

DO_NOTHING :不采取任何行为。一切全看数据库级别的约束。

以上这些选项只是Django级别的,数据级别依旧是RESTRICT!

表关系

表之间的关系都是通过外键来进行关联的。而表之间的关系,无非就是三种关系:一对一、一对多(多对一)、多对多等。

一对多

应用场景:比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。

实现方式:一对多或者多对一,都是通过 ForeignKey 来实现的。

还是以文章和作者的案例进行记录。

class User(models.Model):      
    username = models.CharField(max_length=20)      
    password = models.CharField(max_length=100)

class Article(models.Model):
     title = models.CharField(max_length=100)      
     content = models.TextField()
     author = models.ForeignKey("User",on_delete=models.CASCADE)

那么以后在给 Article 对象指定 author ,就可以使用以下代码来完成:

article = Article(title='abc',content='123') 
author = User(username='zhiliao',password='111111')
# 要先保存到数据库中
author.save()
article.author = author 
article.save()

并且以后如果想要获取某个用户下所有的文章,可以通过 article_set 来实现。

user = User.objects.first()

# 获取第一个用户写的所有文章
articles = user.article_set.all() 
for article in articles:     
    print(article)

一对一

应用场景:比如一个用户表和一个用户信息表。在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的。如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中我们叫做 UserExtension 。但是用户表 User 和用户信息表 UserExtension 就是典型的一对一了。

实现方式: Django 为一对一提供了一个专门的 Field 叫做 OneToOneField 来实现一对一操作。

class User(models.Model):      
    username = models.CharField(max_length=20)      
    password = models.CharField(max_length=100)
class UserExtension(models.Model):  
     birthday = models.DateTimeField(null=True)        
     school = models.CharField(blank=True,max_length=50)        
     user = models.OneToOneField("User", on_delete=models.CASCADE)

UserExtension 模型上增加了一个一对一的关系映射。其实底层是在 UserExtension 这个表上增加了一个 user_id ,来和 user 表进行关联,并且这个外键数据在表中必须是唯一的,来保证一对一。

多对多

应用场景:比如文章和标签的关系。一篇文章可以有多个标签,一个标签可以被多个文章所引用。因此标签和文章的关系是典型的多对多的关系。

实现方式: Django 为这种多对多的实现提供了专门的 Field 。叫做 ManyToManyField 。还是拿文章和标签为例进行讲解。

class Article(models.Model):
    title = models.CharField(max_length=100)      
    content = models.TextField()
    tags = models.ManyToManyField("Tag",related_name="articles")

class Tag(models.Model):      
    name = models.CharField(max_length=50)

在数据库层面,实际上 Django 是为这种多对多的关系建立了一个中间表。这个中间表分别定义了两个外键,引用到 articletag 两张表的主键。

related_name和related_query_name

related_name

还是以 UserArticle 为例来进行。如果一个 article 想要访问对应的作者,那么可以通过author 来进行访问。

但是如果有一个 user 对象,想要通过这个 user 对象获取所有的文章,这时候可以通过 user.article_set 来访问,这个名字的规律是 模型名字小写_set

user = User.objects.get(name='张三') 
user.article_set.all()

如果不想使用 模型名字小写_set 的方式,想要使用其他的名字,那么可以在定义模型的时候指定related_name

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 传递related_name参数,以后在方向引用的时候使用articles进行访问
    author = models.ForeignKey("User",on_delete=models.SET_NULL,null=True,related_name='articles')

以后在反向引用的时候。使用 articles 可以访问到这个作者的文章模型。

user = User.objects.get(name='张三') 
user.articles.all()

如果不想使用反向引用,那么可以指定 related_name='+'

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 传递related_name参数,以后在方向引用的时候使用articles进行访问
    author = models.ForeignKey("User",on_delete=models.SET_NULL,null=True,related_name='+')

以后将不能通过 user.article_set 来访问文章模型了

related_query_name

在查找数据的时候,可以使用 filter 进行过滤。使用 filter 过滤的时候,不仅仅可以指定本模型上的某个属性要满足什么条件,还可以指定相关联的模型满足什么属性。比如现在想要获取写过标题为 abc 的所有用户,那么可以这样写:

users = User.objects.filter(article__title='abc')

如果设置了 related_namearticles ,因为反转的过滤器的名字将使用 related_name 的名字,那么上例代码将改成如下:

users = User.objects.filter(articles__title='abc')

可以通过 related_query_name 将查询的反转名字修改成其他的名字。比如 article 。示例代码如下:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 传递related_name参数,以后在方向引用的时候使用articles进行访问
    author = models.ForeignKey("User",on_delete=models.SET_NULL,null=True,related_name='articl es',related_query_name='article')

那么在做反向过滤查找的时候就可以使用以下代码:

users = User.objects.filter(article__title='abc')

SQL的一些常用命令,使用环境MySQL8.0,个人使用记录,非教程。

部分常用指令

登录 MySQL

sudo mysql -uroot -p

创建数据库在这里,database_name 是您想要创建的数据库名称。

CREATE DATABASE database_name;

查看数据库,这将列出所有可用的数据库。

SHOW DATABASES;

选择数据库,在这里,database_name 是您想要选择的数据库名称。

USE database_name;

列出数据库中的所有表,可以使用 SHOW TABLES

SHOW TABLES;

查看表的结构数据,使用 DESCRIBE ,在这里,datasheets 是您想要选择的数据表名称。

DESCRIBE datasheets;

或者,使用 SHOW COLUMNS 命令

SHOW COLUMNS FROM datasheets;

示例 SQL 语句,查看 wp_options 表的结构:

DESCRIBE wp_options;

查看修改某个表中某字段下的内容

查看表 wp_users 下 user_pass 的内容

SELECT user_pass FROM wp_users;

# 这个查询将显示所有用户的用户名(user_login)和加密后的密码(user_pass)
SELECT user_login, user_pass FROM wp_users;

修改表 wp_users 下 user_pass 的内容bfa0022e2da2d6ea1dfe8cec00964ba7

# 将your_username替换为您想要更改密码的用户名。
# 这个命令会将指定用户的user_pass字段更新为您提供的哈希值
UPDATE wp_users SET user_pass = 'bfa0022e2da2d6ea1dfe8cec00964ba7' WHERE user_login = 'your_username';

例如在按照教程 https://www.xuanmo.xin/details/2987 部署主题时,要修改数据库。内容如下:

Tips: 先到数据库找到WordPress的表 wp_options ,修改 siteurl 和 home 字段,值改为 http://{你的域名}:3002 端口

要查看 wp_options 表中 option_name 字段下 home 的内容,可以使用以下 SQL 查询:

SELECT option_value FROM wp_options WHERE option_name = 'home';

使用 UPDATE 语句来修改 wp_options 表中 option_name 字段下 home 的内容。以下是一个示例 SQL 语句,用于将 home 的内容修改为 http://xm.moshanghua.net:3002

UPDATE wp_options
SET option_value = 'http://xm.moshanghua.net:3002'
WHERE option_name = 'home';

MySQL备份与导入

使用mysqldump工具备份

mysqldump是MySQL自带的逻辑备份工具,可以备份整个数据库或者其中的部分表。以下是一个基本的备份命令:

mysqldump -u 用户名 -p 数据库名 > 备份文件.sql

这个命令会提示你输入密码,并将指定的数据库备份到一个.sql文件中。

备份数据库到指定目录

mysqldump -u username -p database_name > /path/to/backup/directory/backup.sql

在这个命令中,username是你的MySQL用户名,database_name 是要备份的数据库名。/path/to/backup/directory/是你要保存备份文件的目录,backup.sql是要保存的备份文件名,名字也可以自己起。
执行这个命令后,会要求你输入密码。输入密码后,等待备份完成。

导入备份

方法一:直接导入 SQL 文件

mysql -u username -p database_name < path/to/backup.sql

这个命令会在登录后直接将 backup.sql 文件的内容导入到 database_name 数据库中。

方法二:登录 MySQL,使用SOURCE 语句。

mysql -u username -p

选择数据库,然后导入文件。

# 如果已经知道要导入的 SQL 文件属于哪个数据库,可以使用以下命令选择数据库:
USE database_name;

# 导入 SQL 文件
# path/to/backup.sql 是 SQL 文件所在的路径。
SOURCE path/to/backup.sql;

博客显示提示建立数据库连接时出错

WordPress博客更换环境后,导入数据库访问提示建立数据库连接时出错,但各种信息是没有问题的。

创建一个的PHP脚本test.php,使用wp-config.php中的数据库连接信息尝试连接到数据库,以检查是否能够成功连接。

<?php
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_database_user');
define('DB_PASSWORD', 'your_database_password');
define('DB_HOST', 'your_database_host');

$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if ($connection) {
    echo "Database connection successful!";
} else {
    echo "Error: Unable to connect to database.";
    echo mysqli_connect_error();
}
?>

显示了Database connection successful! 连接是没问题的。

解决办法...就删掉了wp-config.php文件,复制wp-config-sample.php文件里的内容重新填写了下数据库的内容,再保存为wp-config.php后,就访问正常了.....

验证PHP安装提示 502

nginx配置如下

server {
  listen 80;
  server_name localhost;
  # 网站根目录
  root /usr/share/nginx/html;

  location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?q=$uri&$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

在访问带php文件的页面就显示502

在nginx里的日志看到如下错误信息

[error] 10795#10795: *11 connect() failed (111: Connection refused) while connecting to upstream, client: 171.106.160.15, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xm.moshanghua.net"

错误信息了解到的信息,这里的上游服务器是指PHP-FPM。

错误码111表示连接被拒绝,这意味着Nginx无法与PHP-FPM通信。

sudo systemctl status php7.4-fpm 看了下状态,PHP-FPM服务在正常运行。

ps aux | grep php-fpm命令来查看所有运行中的进程,并且通过grep命令过滤出与php-fpm相关的进程,进程也没问题。

netstat -ant |grep 9000来检查端口9000上的网络连接情况。

这个命令通常用于确认PHP-FPM服务是否正在监听TCP端口9000,因为PHP-FPM默认可能会监听这个端口。

执行这个命令时,您可能会看到类似以下的输出:

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

但在输出中看不到任何监听端口9000的行,那么PHP-FPM可能没有配置为监听TCP端口9000,或者服务没有运行。

在这种情况下,检查PHP-FPM的配置文件(通常位于 /etc/php/7.4/fpm/pool.d/www.conf 或类似路径),确认listen指令是否正确设置为监听端口9000

不是就修改一下让其指向TCP端口,因为Nginx配置用的也是TCP端口。

但指向套接字文件好像不行,就算Nginx配置里也用Unix socket,也有问题,不知道是不是路径有问题...具体情况没研究了。

一般在 www.conf 文件的30多行的样子,会看到一条listen指令 listen = /run/php/php8.1-fpm.sock

这里把它修改了或者注释重新起一行,让它指向TCP端口

;listen = /run/php/php8.1-fpm.sock
listen = 127.0.0.1:9000

保存后重启一下php-fpm sudo systemctl restart php7.4-fpm

再次访问应该就能看到展示PHP的所有配置信息了。

访问出现An error occurred.

访问出现An error occurred.时

确认Nginx配置里的PHP请求的处理方式部分下fastcgi_param指令。(大概?

fastcgi_param指令用于设置发送到FastCGI服务器的参数

访问出现File not found.

确认输入的文件名...

基础环境

Ubuntu22.04

安装Nginx

如果不想要最新版的 Nginx,可以直接执行 sudo apt -y install nginx ,
Ubuntu 22.04使用 apt 软件包管理器安装默认的是 nginx1.18 版本。

想用 1.18 版本以上或以下指定版本可用以下方法。

通过apt命令安装指定版本

1.更新Ubuntu系统内的软件包。

sudo apt update

2.添加 apt 源文件
将 Nginx 的主线仓库添加到 /etc/apt/sources.list 文件

可以使用tee命令将文本直接写入文件。

# 备份源文件(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 编辑源文件
# 可以使用tee命令将文本直接写入文件
# 这里使用了 tee -a 命令,其中 -a 参数表示将内容追加到文件末尾,而不是覆盖现有文件。
# 添加二进制包仓库:
echo "deb http://nginx.org/packages/mainline/ubuntu/ jammy nginx" | sudo tee -a /etc/apt/sources.list

# 添加源代码仓库
echo "deb-src http://nginx.org/packages/mainline/ubuntu/ jammy nginx" | sudo tee -a /etc/apt/sources.list

说明:服务器Ubuntu版本是Ubuntu22.04(LTS)版的,所以系统代号是:jammy
如果要查看系统代号,使用命令 lsb_release -c 或者 lsb_release -cs

root@chixm: # lsb_release -c
Codename:       jammy

root@chixm: # lsb_release -cs
jammy

3.导入nginx公钥
因为在 Ubuntu 22.04 上导入 Nginx 官方公钥时,使用apt-key导入秘钥,会警告apt-key 命令已经不再被推荐使用。
所以可以使用gpg命令和相关的目录来管理密钥。
下载 Nginx 公钥: 可以使用 curl 或 wget 来下载公钥文件。

## 使用 curl
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor > nginx.gpg

## 使用 wget
wget https://nginx.org/keys/nginx_signing.key -O - | gpg --dearmor > nginx.gpg

再将公钥导入到 APT 密钥环

sudo install -o root -g root -m 644 nginx.gpg /etc/apt/trusted.gpg.d/

最后,更新软件包列表以确保 APT 包管理器使用新的公钥。

sudo apt update

4.安装Nginx。

# 查看可安装的 nginx 版本
sudo apt-cache show nginx

#安装nginx 1.25.1
sudo apt-get install nginx=1.25.0-1~jammy

# 查看Nginx版本
sudo nginx -v

5.然后启动nginx

sudo systemctl start nginx

如果有如下报错的话:

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

多半是内置的Apache抢占了nginx的端口,执行以下命令:

sudo systemctl stop apache2.service
sudo systemctl restart nginx

6.nginx 部分配置与命令

使用systemctl命令控制服务:
设置开机启动: sudo systemctl enable nginx
启动nginx:sudo systemctl start nginx
停止nginx:sudo systemctl stop nginx
重启nginx:sudo systemctl restart nginx
查看状态:sudo systemctl status nginx

配置路径:
nginx 配置文件目录: /etc/nginx ;
配置文件:/etc/nginx/conf.d/default.conf;
默认存放网站的目录:/usr/share/nginx/html,如果需要更改目录修改配置文件的内容即可

安装 PHP

以下是安装不同版本的 PHP 和 一些常用扩展的方法步骤。

php7.4

使用的版本是7.4,就以这个版本操作。

1.首先需要安装PHP的仓库:

sudo apt install software-properties-common

2.然后添加ondrej/php存储库,它提供了多个PHP版本:

sudo add-apt-repository ppa:ondrej/php

出现 Press [ENTER] to continue or Ctrl-c to cancel. 时按回车继续。
注意:(ondrej/php)是第三方仓库,可能会带来一些风险,因为它不是Ubuntu官方维护的。如果介意,请安装 ubuntu 提供的默认版本 。

3.再次更新安装包:

sudo apt update

4.然后就可以直接安装php7.4了!

sudo apt install php7.4

# 这里如果需要php7.4-fpm服务,也可以直接用以下命令去安装,
# 该指令会直接安装包含 php 在内的 php7.4 和 php7.4-fpm
sudo apt install php7.4-fpm -y

5.安装PHP扩展(可以根据需要删减需要的)。
PHP 扩展的安装通常是以 php 开头,接着是版本号,然后是-和扩展名称。格式php7.4-[extname]

并不是所有 php 扩展都可以通过 apt 命令进行安装,Apt 仓库仅提供常用 PHP 扩展,某些扩展可能需要自己手动编译。

sudo apt install -y php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip

6.安装 php-fpm

## 安装 PHP-FPM
sudo apt install php7.4-fpm

在安装PHP扩展之后,重启PHP-FPM服务,否则新的PHP扩展不会加载到PHP-FPM。运行命令 sudo systemctl restart php7.4-fpm

使用systemctl命令控制服务:
启动服务 sudo systemctl start php7.4-fpm
开机自启动 sudo systemctl enable php7.4-fpm
检查 PHP-FPM 服务状态 sudo systemctl status php7.4-fpm
重新启动 sudo systemctl restart php7.4-fpm

7.创建文件验证PHP安装

echo '<?php phpinfo(); ?>' | sudo tee /usr/share/nginx/html/info.php

phpinfo()函数会展示PHP的所有配置信息,然后写入到了info.php。(测试完记得删除)

再修改 nginx 配置文件以支持PHP,/etc/nginx/conf.d/default.conf

server {
  listen 80;
  server_name localhost;
  # 网站根目录
  root /usr/share/nginx/html;

  location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?q=$uri&$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

修改Nginx配置文件后可以运行nginx -t命令测试Nginx配置的语法是否正确。

如果没有错误nginx会提示nginx: configuration file /etc/nginx/nginx.conf test is successful

测试Nginx配置正确之后重启服务 sudo systemctl restart nginx

注意:
如果出现502 Bad Gateway。
检查 PHP-FPM 的配置文件(路径通常位于 /etc/php/7.4/fpm/pool.d/www.conf ),确认 listen 指令是否正确设置为监听端口9000

详细修改信息可以看文章 迁移博客遇到的几个问题 下的验证PHP安装提示 502

再次访问应该就能看到展示PHP的所有配置信息了。

PHP8.1

Ubuntu 22.04 使用 apt 软件包管理器安装默认的是 PHP 8.1 版本。

1.运行以下命令,安装PHP。

sudo apt -y install php-fpm

2.安装常用PHP扩展(例如:curl、gd、mbstring、mysql、xml、zip等):

sudo apt install php-curl php-gd php-mbstring php-mysql php-xml php-zip

3.修改Nginx配置文件以支持PHP。

此步骤参考上文PHP7.4的安装步骤第7小节,创建文件验证PHP安装。

使用systemctl命令控制服务:
启动服务 sudo systemctl start php8.1-fpm
开机自启动 sudo systemctl enable php8.1-fpm
检查 PHP-FPM 服务状态 sudo systemctl status php8.1-fpm
重新启动 sudo systemctl restart php8.1fpm

PHP8.2

在 Ubuntu 20.04 安装 PHP 8.2 和上文安装 php7.4 一样。

需要做的就是启用 ondrej/php 存储库,并使用 apt 安装 PHP 8.2。

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

sudo apt update
sudo apt install php8.2-fpm

PHP 扩展的安装通常是以 php 开头,接着是版本号,然后是-和扩展名称。格式php8.2-[extname]

并不是所有php扩展都可以通过apt命令进行安装,Apt仓库仅提供常用PHP扩展,某些扩展可能需要自己手动编译。

例如,要安装MySQL和GD扩展,您可以运行命令sudo apt install php8.2-mysql php8.2-gd

sudo apt update
sudo apt install php8.2-mysql php8.2-gd -y
sudo systemctl restart php8.2-fpm
sudo systemctl status php8.2-fpm

安装MySQL

安装MySQL8.0

#
sudo apt -y install mysql-server

#查看MySQL版本
mysql -V

配置MySQL

进入MySQL

sudo mysql

设置root用户密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';

## 密码以Mysql.1234为例
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'Mysql.1234';

## 退出MySQL数据库
exit;

对MySQL进行安全性配置

sudo mysql_secure_installation

输入root用户的密码。本示例中输入Mysql.1234

$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

配置说明(Yes | No 根据需要自行选择):
输入Y,设置密码验证策略

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

根据提示,选择密码验证策略。本示例输入2

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

输入Y,更改root用户密码。(根据需要,也可以不改)

Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

输入root用户密码。(如果跳过了上一步,这一步也不会出现)

New password:

Re-enter new password:

Estimated strength of the password:

输入Y,确认使用已设置的密码

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

输入Y删除MySQL自带的匿名用户

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y

输入Y,禁止MySQL的root用户的远程登录权限。后面也可修改

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y

输入Y,移除test数据库。

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 

输入Y,重新加载授权表。

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y

当命令行回显All done!时,表示配置完成。

测试登录MySQL数据库。

## 登录MySQL数据库
sudo mysql -uroot -p

安装MySQL5.7

进入MySQL官方的Community Server选择历史版本:https://downloads.mysql.com/archives/community/

1.下载tar包

可以使用wget命令链接下载地址,也可以使用腾讯云提供的文件上传,将tar包放在Ubuntu的一个目录中

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar

在目录下解压tar包

tar xvf mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar

2.安装

安装依赖lib包

sudo apt-get install ./libmysql*
sudo apt-get install libtinfo5

安装客户端和服务端,按提示可能要先安装community版本

sudo apt-get install ./mysql-community-client_5.7.42-1ubuntu18.04_amd64.deb
sudo apt-get install ./mysql-client_5.7.42-1ubuntu18.04_amd64.deb

#此步需要输入数据的root密码
sudo apt-get install ./mysql-community-server_5.7.42-1ubuntu18.04_amd64.deb

sudo apt-get install ./mysql-server_5.7.42-1ubuntu18.04_amd64.deb 

过程中会提示设置MySQL的密码,用户名默认root

3.启动MySQL

对MySQL进行安全性配置

配置说明见上文8.0部分

sudo mysql_secure_installation

检查mysql服务状态

systemctl status mysql.service

出现下面界面说明安装成功

root@chixm: ~# systemctl status mysql.service
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-04-22 00:48:15 CST; 40s ago
    Process: 18203 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
    Process: 18242 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid (code=exited, status=0/SUCC>
   Main PID: 18244 (mysqld)
      Tasks: 27 (limit: 1939)
     Memory: 170.5M
        CPU: 312ms
     CGroup: /system.slice/mysql.service
             └─18244 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Apr 21 00:48:14 iZ7xv436kce53s2t1abuavZ systemd[1]: Starting MySQL Community Server...
Apr 21 00:48:15 iZ7xv436kce53s2t1abuavZ systemd[1]: Started MySQL Community Server.

至此MySQL5.7.42已经安装成功。

登录MySQL

mysql -u root -p

如果不想使用终端管理 mysql,也可以使用图形界面 phpMyAdmin

安装 phpMyAdmin Nginx

当前phpMyAdmin稳定版本5.2.1。这里在Nginx的根目录安装phpMyAdmin。

切换Nginx的默认根目录。

cd /usr/share/nginx/html

下载phpMyAdmin。

wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip

下载完成运行unzip命令解压缩phpMyAdmin源码。

sudo unzip phpMyAdmin-5.2.1-all-languages.zip

重命名一下目录,配置时简短一点

mv phpMyAdmin-5.2.1-all-languages phpmyadmin

配置Nginx PhpMyAdmin

配置Nginx运行phpMyAdmin。

方法一:是使用Nginx的location来运行phpMyAdmin。

Nginx配置文件/etc/nginx/conf.d/default.conf

server {
    listen 80;
    listen 443 ssl http2;
    server_name xm.moshanghua.net;
    root /usr/share/nginx/html;

    location / {
        index index.php index.html index.htm;
        try_files $uri$uri/ /index.php?q=$uri&$args;
    }

    location /phpmyadmin/ {
        alias /usr/share/nginx/html/phpmyadmin/;# 注意末尾的斜杠
        index index.php index.html index.htm;
        try_files $uri $uri/ /phpmyadmin/index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    # 不想启用 HTTPS 就注释或者删除下面这段配置,上面的 listen 443 也注释掉
    # 引入证书文件开始
    ssl_certificate   /etc/nginx/ssl/xm.moshanghua.net.pem; #指定SSL证书文件路径。
    ssl_certificate_key  /etc/nginx/ssl/xm.moshanghua.net.key; # 指定SSL证书密钥文件路径。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1;
    ssl_prefer_server_ciphers on;
    # 引入证书文件结束
}

修改配置后,nginx -t命令测试Nginx配置的语法

sudo systemctl restart nginx使nginx配置文件生效

要访问phpMyAdmin界面,输入URLhttps://xm.moshanghua.net/phpmyadmin/index.php

在用户名字段中输入前面安装的数据库的用户名root或者设置名称,在密码字段中输入数据库的密码。

然后登录后,就能看到phpMyAdmin面板。

方法二:配置Nginx的Server块,通过独立子域名来运phpMyAdmin。

另外创建一个Nginx的Server块并配置独立的子域名。

server {
    listen 80;
    listen 443 ssl http2;
    server_name phpmyadmin.moshanghua.net;
    root /usr/share/nginx/html/phpmyadmin;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # 引入证书文件开始
    ssl_certificate   /etc/nginx/ssl/phpmyadmin.moshanghua.net.pem; #指定SSL证书文件路径。
    ssl_certificate_key  /etc/nginx/ssl/phpmyadmin.moshanghua.net.key; # 指定SSL证书密钥文件路径。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1;
    ssl_prefer_server_ciphers on;
    # 引入证书文件结束

}

修改配置后,nginx -t命令测试Nginx配置的语法

sudo systemctl restart nginx使nginx配置文件生效

要访问phpMyAdmin界面,输入URLhttps://phpmyadmin.moshanghua.net/index.php

在用户名字段中输入前面安装的数据库的用户名root或者设置名称,在密码字段中输入数据库的密码。

然后登录后,就能看到phpMyAdmin面板。

几处配置

创建临时目录

变量 $cfg['TempDir'] (/usr/share/nginx/html/phpmyadmin/tmp/)无法访问。phpMyAdmin无法缓存模板文件,所以会运行缓慢。

解决此问题:

1.确保临时目录存在

检查 phpmyadmin/ 目录下是否存在/tmp目录,如果不存在,需要创建它:

sudo mkdir -p phpmyadmin/tmp

确保 Nginx 用户(通常是 www-data)有权限读写该临时目录。

sudo chown www-data:www-data phpmyadmin/tmp
sudo chmod 700 phpmyadmin/tmp

2.配置 phpMyAdmin
复制 phpMyAdmin 目录下的示例配置文件并且重命名为config.inc.php来配置 phpMyAdmin,直接新建空白config.inc.php文件也可以。

sudo cp phpmyadmin/config.sample.inc.php phpmyadmin/config.inc.php

需要在 phpMyAdmin 的配置文件 config.inc.php 末尾添加设置 $cfg['TempDir']
文件路径根据存放位置来写,本文存放在/usr/share/nginx/html/

# 打开文件
sudo vim phpmyadmin/config.inc.php

# 末尾添加
$cfg['TempDir'] = '/usr/share/nginx/html/phpmyadmin/tmp';

3.重启 Nginx 和 PHP-FPM

保存配置文件的更改,并重启 Nginx 和 PHP-FPM 以确保更改生效:

sudo systemctl restart nginx

# 对应自己安装的版本
sudo systemctl restart php7.4-fpm

设置一个 短语密码

从 phpMyAdmin 4.0.0 版本开始,config.inc.php 配置文件支持使用短语密码(也称为“密码短语”或“passphrase”)来加密存储在配置中的敏感数据,如 blowfish_secret

设置 blowfish_secret 的步骤:

1.生成加密密钥

生成一个随机的加密密钥:

1.使用密码生成器成一个随机的密码短语。
随机密码生成器
Random Password Generator

2.使用命令行工具,如 opensslopenssl rand -base64 24

root@chixm:~# openssl rand -base64 24
Gt1jl6WQJy5HoUQcHp4+I0Y7Qfnfd+eu

这将生成一个 24 字节的随机字符串,以 Base64 编码。

2.编辑配置文件

将生成的加密密钥添加到您的 config.inc.php 文件中,设置 blowfish_secret

$cfg['blowfish_secret'] = '你生成的随机密码短语';

# 打开编辑器
sudo vim phpmyadmin/config.inc.php

#添加一下配置到文件末尾
$cfg['blowfish_secret'] = 'Gt1jl6WQJy5HoUQcHp4+I0Y7Qfnfd+eu'; // 可以是任何随机字符串

3.重启 Nginx 和 PHP-FPM

保存配置文件的更改,并重启 Nginx 和 PHP-FPM 以确保更改生效:

sudo systemctl restart nginx

# 对应自己安装的版本
sudo systemctl restart php7.4-fpm

配置数据库 phpMyAdmin

报错下图信息是因为phpMyAdmin 需要数据库表。


所以,要导入自带的 phpMyAdmin 归档包 create_tables.sql 来为 phpMyAdmin 创建表。

使用 MySQL 客户端或 phpMyAdmin 登录到数据库服务器,创建数据库 phpmyadmin,并导入create_tables.sql的数据。

使用 MySQL 导入演示:
登录

mysql -u root -p

创建数据库 phpmyadmin

CREATE DATABASE phpmyadmin;

选择数据库,然后导入目录 phpMyAdmin/sql下的 create_tables.sql 这个库。

# 选择数据库
USE phpmyadmin;

# 导入数据
SOURCE /usr/share/nginx/html/phpmyadmin/sql/create_tables.sql;

完整步骤:

root@chixm:~ # mysql -u root -p

mysql> CREATE DATABASE phpmyadmin;
Query OK, 1 row affected (0.00 sec)

mysql> USE phpmyadmin;
Database changed
mysql> SOURCE /usr/share/nginx/html/phpmyadmin/sql/create_tables.sql;
Query OK, 1 row affected, 1 warning (0.00 sec)

Database changed
Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.02 sec)

...

mysql>

这时再刷新就没有错误提示了。

安装部署Node.js环境

演示版本v16.17.0,更多版本访问官网 Node.js

使用NVM安装管理多个Node.js版本

NVM(Node Version Manager)是Node.js的版本管理软件,可以轻松在Node.js各个版本间进行切换。
以下是简单的安装使用,更多信息可以前往 NVM 的 Github仓库进行查看

https://github.com/nvm-sh/nvm

安装 NVM

使用 cURL 或 Wget 命令:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

运行以下命令以加载 NVM 环境

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

验证 NVM 是否安装成功

nvm --version

使用 NVM 管理 Node.js 版本

查看可用的 Node.js 版本

通过以下命令查看所有可用的 Node.js 版本:

nvm ls-remote

安装特定版本的 Node.js

例如,要安装最新的 LTS 版本:

nvm install --lts

要安装其他特定版本,例如 v16.17.0 版本:

nvm install 16.17.0

查看已安装的 Node.js 版本

使用以下命令查看系统中已安装的所有 Node.js 版本:

nvm ls

切换 Node.js 版本

要切换到特定版本的 Node.js,例如切换到 v16.17.0 版本:

nvm use 16.17.0

设置默认 Node.js 版本

要将某个版本设置为默认版本,例如设置 v16.17.0 为默认版本:

nvm alias default 16.17.0

卸载 Node.js 版本

要卸载某个版本的 Node.js,例如卸载 v16.17.0 版本:

nvm uninstall 16.17.0

使用 Node.js 和 npm

使用以下命令来查看当前使用的 Node.js 和 npm 版本:

node -v
npm -v

使用二进制文件安装

该方式使用的安装包是已编译好的二进制文件。解压文件之后,在bin文件夹中就已存在node和npm,无需重复编译。

如果需要将该软件安装到其他目录下,又不想后期移动,可以先进入其目录下执行下载解压命令

本文以安装Node.js v16.0.0版本为例,且文件放在根目录下。

具体操作说明如下:

# 进入根目录
cd ~

pwd
/root

下载Node.js安装包。

wget https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz

解压Node.js安装包

tar xvf node-v16.17.0-linux-x64.tar.xz

创建node和npm的软链接。

创建软链接后,您可以在任意目录下直接使用node和npm命令。

ln -s /root/node-v16.17.0-linux-x64/bin/node /usr/local/bin/node
ln -s /root/node-v16.17.0-linux-x64/bin/npm /usr/local/bin/npm

至此,Node.js环境已安装完毕。软件默认安装在/root/node-v16.0.0-linux-x64/目录下。

参考文章 、资料

Kimi.ai
ubuntu 18.04 apt 升级 nginx 1.14 到 nginx 1.21.0
手动部署LNMP环境(Ubuntu)
服务器Ubuntu Server 22.04安装低版本MySQL5.7
https://cumi.co/20221006/
如何在Ubuntu 22.04安装 phpMyAdmin Nginx