lnmp 的安装

2.6k 词

文章封面: 无题 by: Mada

文章使用的是 Debian 12CentOS-Stream 8系统。

注:Debian 12CentOS-Stream 8安装的依赖不同,其他安装的方法是一样的。

本人为新手,如有错误或不足之处,欢迎指正。

准备工作

Debian 12:

先安装一个叫aptitude的管理软件包工具,这个工具可以对依赖关系的更好的处理能力,就是安装依赖包更方便。

1
2
3
apt-get update && apt-get upgrade
apt-get install aptitude && aptitude update
aptitude upgrade

安装依赖

1
aptitude install gcc make libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev libaio1 libaio-dev pkg-config libxml2 libxml2-dev sqlite3 libsqlite3-dev libonig-dev libjemalloc-dev build-essential

CentOS-Stream 8:

1
2
3
dnf update && dnf upgrade
dnf install gcc gcc-c++ make autoconf automake libtool pcre pcre-devel openssl openssl-devel libxml2 libxml2-devel sqlite sqlite-devel epel-release
dnf install jemalloc jemalloc-devel

注意:要先把 epel-release 安装了后,才能安装 jemallocjemalloc-devel

安装onigurumaoniguruma-devel

1
2
3
4
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar -zxf oniguruma-6.9.4.tar.gz && cd oniguruma-6.9.4
./autogen.sh && ./configure --prefix=/usr
make && make install

nginx

  1. 创建nginx用户

    1
    useradd nginx -M -s /sbin/nologin
  2. 下载nginxpcreopenssl

    1
    2
    3
    wget https://nginx.org/download/nginx-1.24.0.tar.gz
    wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
    wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1v/openssl-1.1.1v.tar.gz
  3. 解压nginxpcreopenssl并进入目录

    1
    2
    3
    tar -zxvf pcre-8.45.tar.gz
    tar -zxvf openssl-1.1.1v.tar.gz
    tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
  4. 使用./configure配置编译选项

    1
    ./configure --prefix=/usr/local/nginx --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-stream --with-stream_ssl_preread_module --with-stream_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1v --with-pcre=../pcre-8.45 --with-pcre-jit --with-ld-opt=-ljemalloc
    • --prefix:指定安装的目录。
    • --with-http_ssl_module:启用 HTTP SSL 模块。
    • 更多查询Nginx 中文文档
  5. 编译和编译安装

    1
    make && make install
  6. 配置nginx环境变量

    1
    2
    3
    4
    5
    6
    vim ~/.bashrc

    export PATH=/usr/local/nginx/sbin:$PATH
    # 👆添加到文件的最后一行

    source ~/.bashrc # 重载
  7. 添加 Systemd 配置

    1
    2
    vim /etc/systemd/system/nginx.service
    # 创建 nginx 服务文件
    nginx.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [Unit]
    Description=nginx
    After=network.target

    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStartPost=/bin/sleep 0.1
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    Restart=always
    TimeoutStartSec=120

    [Install]
    WantedBy=multi-user.target
  8. 重载配置并启动nginx

    1
    2
    systemctl daemon-reload
    systemctl start nginx.service
  9. 设置nginx开机自启

    1
    systemctl enable nginx.service

mysql

  1. 创建mysql用户

    1
    useradd mysql -M -s /sbin/nologin
  2. 下载mysql

    1
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.35-linux-glibc2.28-x86_64.tar.xz
  3. 解压并重命名

    1
    2
    tar -xvf mysql-8.0.35-linux-glibc2.28-x86_64.tar.xz
    mv mysql-8.0.35-linux-glibc2.28-x86_64 mysql
  4. 移动mysql目录并在mysql下创建data文件夹

    1
    2
    3
    mv mysql /usr/local
    cd /usr/local/mysql
    mkdir data
  5. 赋予mysql所有权

    1
    2
    chown -R mysql:mysql /usr/local/mysql && cd bin
    # 将目录以下所有权赋予了 mysql 用户和 mysql 组
  6. mysql数据库的初始化

    1
    2
    ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
    # 会在最后一行末位生成随机的密码
    • --initialize:表示进行数据库的初始化操作,MySQL 会生成系统表数据和密码,并将其存储在数据目录中。
    • --user:指定用户运行 MySQL。
    • --basedir:MySQL 的安装根目录。
    • --datadir:MySQL 的数据库目录。
  7. 配置mysql环境变量

    1
    2
    3
    4
    5
    6
    vim ~/.bashrc

    export PATH=/usr/local/mysql/bin:/usr/local/nginx/sbin:$PATH
    # 追加路径

    source ~/.bashrc # 重载
  8. 添加my.cnf配置文件

    这是我的模板
    PS:这个文件我找了很久都没有找到,只好自己配置了

    1
    vim /etc/my.cnf
    my.cnf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    [client]
    port = 3306 # 客户端连接MySQL服务器的端口
    socket = /tmp/mysql.sock # 客户端通过socket连接MySQL服务器的路径
    default-character-set = utf8mb4 # 客户端的默认字符集

    [mysql]
    prompt="MySQL [\d]> " # MySQL命令行提示符的格式
    no-auto-rehash # 禁用自动补全功能

    [mysqld]
    port = 3306 # 服务器监听的端口
    socket = /tmp/mysql.sock # 服务器的socket文件路径
    default_authentication_plugin = mysql_native_password # 服务器的默认认证插件

    basedir = /usr/local/mysql # MySQL的基础目录,通常是MySQL的安装目录
    datadir = /usr/local/mysql/data # MySQL的数据目录,用于存储数据库文件
    pid-file = /usr/local/mysql/data/mysql.pid # MySQL进程ID文件的路径
    user = mysql # 运行MySQL服务器的用户
    bind-address = 0.0.0.0 # MySQL服务器绑定的IP地址
    server-id = 1 # 服务器ID,用于复制

    init-connect = 'SET NAMES utf8mb4' # 连接初始化时执行的命令
    character-set-server = utf8mb4 # 服务器的默认字符集
    collation-server = utf8mb4_0900_ai_ci # 服务器的默认排序规则

    skip-name-resolve # 禁用主机名解析
    #skip-networking # 禁用网络连接
    back_log = 300 # 服务器在开始拒绝连接之前的最大连接请求数量

    max_connections = 321 # 服务器允许的最大并发连接数
    max_connect_errors = 6000 # 服务器在开始拒绝来自某个主机的连接之前的最大连接错误数
    open_files_limit = 65535 # 服务器可以打开的最大文件数
    table_open_cache = 128 # 服务器可以缓存的打开表的数量
    max_allowed_packet = 500M # 服务器允许的最大数据包大小
    binlog_cache_size = 1M # 二进制日志缓存的大小
    max_heap_table_size = 8M # 内存表的最大大小
    tmp_table_size = 16M # 临时表的最大大小

    read_buffer_size = 2M # 读取缓冲区的大小
    read_rnd_buffer_size = 8M # 随机读取缓冲区的大小
    sort_buffer_size = 8M # 排序缓冲区的大小
    join_buffer_size = 8M # 连接缓冲区的大小
    key_buffer_size = 4M # 键缓冲区的大小

    thread_cache_size = 8 # 线程缓存的大小

    ft_min_word_len = 4 # 全文索引中的最小词长度

    log_bin = mysql-bin # 启用二进制日志,并设置日志文件的前缀
    binlog_format = mixed # 二进制日志的格式
    binlog_expire_logs_seconds = 604800 # 二进制日志的过期时间

    log_error = /usr/local/mysql/data/mysql-error.log # 错误日志文件的路径
    slow_query_log = 1 # 启用慢查询日志
    long_query_time = 1 # 慢查询的阈值
    slow_query_log_file = /usr/local/mysql/data/mysql-slow.log # 慢查询日志文件的路径

    performance_schema = 0 # 禁用性能模式
    explicit_defaults_for_timestamp # 显式设置TIMESTAMP列的默认值

    #lower_case_table_names = 1 # 表名和数据库名的大小写敏感性

    skip-external-locking # 禁用外部锁定

    default_storage_engine = InnoDB # 默认的存储引擎
    #default-storage-engine = MyISAM # 默认的存储引擎
    innodb_file_per_table = 1 # 为每个InnoDB表使用单独的表空间文件
    innodb_open_files = 500 # InnoDB可以打开的最大文件数
    innodb_buffer_pool_size = 64M # InnoDB缓冲池的大小
    innodb_write_io_threads = 4 # InnoDB的写入I/O线程数
    innodb_read_io_threads = 4 # InnoDB的读取I/O线程数
    innodb_thread_concurrency = 0 # InnoDB的并发线程数
    innodb_purge_threads = 1 # InnoDB的清理线程数
    innodb_flush_log_at_trx_commit = 2 # InnoDB事务提交时的日志刷新策略
    innodb_log_buffer_size = 2M # InnoDB日志缓冲区的大小
    innodb_log_file_size = 32M # InnoDB日志文件的大小
    innodb_log_files_in_group = 3 # InnoDB日志文件组中的文件数
    innodb_max_dirty_pages_pct = 90 # InnoDB缓冲池中脏页的最大比例
    innodb_lock_wait_timeout = 120 # InnoDB锁等待的超时时间

    bulk_insert_buffer_size = 8M # 批量插入缓冲区的大小
    myisam_sort_buffer_size = 8M # MyISAM排序缓冲区的大小
    myisam_max_sort_file_size = 10G # MyISAM排序文件的最大大小

    interactive_timeout = 28800 # 交互式连接的超时时间
    wait_timeout = 28800 # 非交互式连接的超时时间

    [mysqldump]
    quick # 使用快速导出模式
    max_allowed_packet = 500M # mysqldump允许的最大数据包大小

    [myisamchk]
    key_buffer_size = 8M # myisamchk的键缓冲区大小
    sort_buffer_size = 8M # myisamchk的排序缓冲区大小
    read_buffer = 4M # myisamchk的读取缓冲区大小
    write_buffer = 4M # myisamchk的写入缓冲区大小
  9. 添加系统服务

    这里提供两种方法。

    1. init 脚本

    复制脚本并赋予权限

    1
    2
    cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d # 复制脚本
    chmod a+x /etc/init.d/mysql.server # 赋予权限

    重载配置并启动mysql

    1
    2
    3
    4
    5
    6
    7
    systemctl daemon-reload
    service mysql.server start # 启动

    # 其他常用命令
    service mysql.server stop # 停止
    service mysql.server restart # 重启
    service mysql.server status # 查看状态

    配置mysql开机自启

    1
    2
    3
    4
    update-rc.d mysql.server defaults

    # 其他常用命令
    update-rc.d mysql.server remove # 这是禁止开机自启

    1. Systemd 单元文件

    添加服务文件

    1
    vim /etc/systemd/system/mysqld.service
    mysqld.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [Unit]
    Description=MySQL Server
    After=network-online.target
    Wants=network-online.target
    After=syslog.target

    [Service]
    User=mysql
    Group=mysql
    Type=forking
    TimeoutSec=0
    PermissionsStartOnly=true
    ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --daemonize
    LimitNOFILE=5000
    Restart=on-failure
    RestartSec=10
    RestartPreventExitStatus=1
    PrivateTmp=false

    [Install]
    WantedBy=multi-user.target
    • --defaults-file:指定配置文件。
    • --daemonize:守护进程(后台运行)。
      注意:确保UserGroup有指定的用户和用户组。

    重载配置并启动mysql

    1
    2
    3
    4
    5
    6
    7
    systemctl daemon-reload # 重新载入配置
    systemctl restart mysqld.service # 启动mysql

    # 其他命令
    systemctl stop mysqld.service # 停止
    systemctl restart mysqld.service # 重启
    systemctl status mysqld.service # 查看状态

    配置mysql开机自启

    1
    2
    systemctl enable mysqld.service # 开启自启
    systemctl disable mysqld.service # 关闭自启

  1. 修改初始化mysql密码

    1
    mysql -u root -p # 输入初始化生成的密码
  2. 更改密码

    修改密码是必须的。

    1
    alter user 'root'@'localhost' identified by "new-pwd";

    new-pwd 替换为你想要使用的新密码。

  3. 重载

    1
    flush privileges; # 重新加载缓存,使密码生效

    Ctrl+D退出


php

  1. 下载php

    1
    wget https://www.php.net/distributions/php-8.2.12.tar.gz
  2. 解压php

    1
    tar -zxvf php-8.2.12.tar.gz && cd php-8.2.12
  3. 使用./configure配置编译选项

    1
    2
    ./configure --prefix=/usr/local/php --enable-mbstring --enable-fpm
    # 可能会提示缺少依赖包,它缺少什么就安装什么。
    • --prefix:指定安装的目录。
    • --enable-mbstring:启用 mbstring 模块。
    • --enable-fpm:启用 PHP-FPM 模块。

    显示以下就 ok 了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +--------------------------------------------------------------------+
    | License: |
    | This software is subject to the PHP License, available in this |
    | distribution in the file LICENSE. By continuing this installation |
    | process, you are bound by the terms of this license agreement. |
    | If you do not agree with the terms of this license, you must abort |
    | the installation process at this point. |
    +--------------------------------------------------------------------+

    Thank you for using PHP.
  4. 编译和编译安装

    1
    make && make install
  5. 复制配置文件和脚本文件

    1
    2
    3
    4
    5
    6
    7
    #当前路径在 ~/lnmp/php-8.2.12 解压目录里

    cp php.ini-development /usr/local/php/lib/php.ini # 配置文件
    cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # 脚本文件
    cd /usr/local/php/etc
    cp php-fpm.conf.default php-fpm.conf # php-fpm.conf 配置文件
    cp php-fpm.d/www.conf.default php-fpm.d/www.conf # www.conf 配置文件
  6. 修改www.conf配置文件

    CentOS-Stream 8跳过这一步,因为用户和用户组是一样的。

    1
    2
    3
    4
    5
    6
    id nobody # 查看是否有 nobody用户

    # Debian 12:
    ╭─root at Debian in /usr/local/php/etc
    ╰─○ id nobody
    uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
    1
    vim /usr/local/php/etc/php-fpm.d/www.conf

    找到 usergroup 修改为以下用户和用户组。

    1
    2
    user = nobody
    group = nogroup
  7. 添加系统服务

    1. init 脚本

    脚本赋权并重载

    1
    2
    chmod 755 /etc/init.d/php-fpm # 赋予权限
    systemctl daemon-reload

    启动并自启

    1
    2
    service php-fpm start
    update-rc.d php-fpm defaults

    1. Systemd 单元文件
    1
    vim /etc/systemd/system/php-fpm.service
    php-fpm.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [Unit]
    Description=The PHP FastCGI Process Manager
    Documentation=http://php.net/docs.php
    After=network.target

    [Service]
    Type=simple
    PIDFile=/usr/local/php/var/run/php-fpm.pid
    ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
    ExecReload=/bin/kill -USR2 $MAINPID
    LimitNOFILE=1000000
    LimitNPROC=1000000
    LimitCORE=1000000

    [Install]
    WantedBy=multi-user.target

    重装启动并自启

    1
    2
    3
    systemctl daemon-reload
    systemctl start php-fpm.service
    systemctl enable php-fpm.service

留言