系列-PHP+Linux服务器环境搭建:Nginx、Redis、Mysql安装

目录

Linux 环境基础安装
Nginx、Redis、Mysql安装
PHP、扩展、composer安装
进程管理工具Supervisor安装
Git、版本管理软件Gogs安装
Laravel项目的相关配置

安装Redis

cd /home/www/soft_download
wget http://download.redis.io/releases/redis-7.0.9.tar.gz
tar -zxvf redis-7.0.9.tar.gz
cd redis-7.0.9
sudo make MALLOC=libc
cd src
sudo make PREFIX=/usr/local/redis install
sudo mkdir -p /etc/redis
sudo cp /home/www/soft_download/redis-7.0.9/redis.conf /etc/redis
sudo cp /home/www/soft_download/redis-7.0.9/redis.conf /etc/redis/6379.conf
sudo cp /home/www/soft_download/redis-7.0.9/utils/redis_init_script /etc/init.d/redis-6379
sudo chown -R www:www /etc/redis
sudo chown -R www:www /usr/local/redis
sudo chown -R www:www /etc/init.d/redis-6379

# 如果配置文件设置了密码授权,则需修改下 /etc/init.d/redis-6379 脚本,否则无法用脚本停止服务
$CLIEXEC -p $REDISPORT shutdown   ==改为==>  $CLIEXEC -p $REDISPORT -a 你的密码 shutdown

# 创建redis的工作目录
mkdir ~/redisdb
# 修改配置
vim /etc/redis/6379.conf
    protected-mode yes         # 设为yes,防黑客攻击,如果从外部访问则必须设置 bind 的IP以及 requirepass 的密码
    bind 127.0.0.1 -::1        # 可以配置多个IP地址
	port 6379
	dbfilename dump-6379.rdb
    dir /home/www/redisdb/
    daemonize no               # 这里不要改为yes,因为最终redis的进程是由supervisor托管的
    requirepass ****           # 一定要设置密码,防黑客攻击
    
# 复制一份并做修改
cp /etc/redis/6379.conf /etc/redis/6380.conf
# 修改启动脚本(内容需稍作修改)
sudo vim /etc/init.d/redis-6379
# 复制一份并做修改
sudo cp /etc/init.d/redis-6379 /etc/init.d/redis-6380
# 修改启动脚本并复制一份
vim /etc/init.d/redis-6379
sudo cp /etc/init.d/redis-6379 /etc/init.d/redis-6380
sudo chown -R www:www /etc/init.d/redis-6380

安装 Nginx

cd /home/www/soft_download
wget -c http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
sudo ./configure --prefix=/usr/local/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --sbin-path=/usr/bin/nginx \
    --user=www \
	--group=www \
    --with-http_ssl_module \
    --with-http_realip_module \
    --http-client-body-temp-path=/usr/local/nginx/tmp/client \
    --http-proxy-temp-path=/usr/local/nginx/tmp/proxy \
    --http-fastcgi-temp-path=/usr/local/nginx/tmp/fcgi \
    --http-scgi-temp-path=/usr/local/nginx/tmp/scgi \
    --http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi \
	--with-http_stub_status_module \
	--with-http_v2_module \
	--with-http_image_filter_module
	
sudo make
sudo make install
sudo mkdir /usr/local/nginx/tmp
sudo chown -R www:www /usr/local/nginx
sudo chown -R www:www /etc/nginx
sudo chown www:www /usr/bin/nginx

编辑主配置文件 /etc/nginx/nginx.conf

user  www;
worker_processes  8;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log /home/www/logs/nginx_error.log;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

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

    # 定义一个名为'main'的日志格式
    #log_format  main  '$remote_addr || $remote_user || [$time_local] || $request '
    #                  '|| $status || $body_bytes_sent || $http_referer '
    #                  '|| $http_user_agent || $http_x_forwarded_for';

    access_log /dev/null;
    # access_log  logs/access.log  main;  # 使用名为'main'的日志格式记录日志

    sendfile        on;
    #tcp_nopush     on;

    # 这个参数表示http连接超时时间,默认是65s。要是上传文件比较大,在规定时间内没有上传完成,就会自动断开连接!所以适当调大这个时间。 
    keepalive_timeout  65;
    
    client_header_timeout 120s;        #调大点
    client_body_timeout 120s;          #调大点
    client_max_body_size 100m;         #主要是这个参数,限制了上传文件大大小
    client_body_buffer_size 256k;   

    gzip  on;
    gzip_min_length  1024;
    gzip_buffers     16 64k;
    gzip_comp_level 3;
    gzip_disable "MSIE [1-6].";
    gzip_types text/plain application/json application/javascript application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;

    include /etc/nginx/conf.d/*.conf;
}

安装MySQL

安装

# contos7默认安装了mariadb数据库,这里把他移除
sudo yum remove mariadb-libs.x86_64
# 查看是否已经安装 Mysql
sudo rpm -qa | grep mysql
# 删除已经安装的 Mysql(xxx 为文件全名)
sudo rpm -e xxx

cd /home/www/soft_download
# 官网https://downloads.mysql.com/archives/community/找到 Linux-Generic 下载链接
wget -c https://downloads.mysql.com/archives/get/p/23/file/mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz
tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz

sudo mv mysql-8.2.0-linux-glibc2.28-x86_64 /usr/local/mysql

# 创建目录 
sudo mkdir /home/www/mysqldb
# 修改配置文件
sudo vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=www
basedir=/usr/local/mysql
datadir=/home/www/mysqldb
socket=/tmp/mysql.sock
log-error=/home/www/mysqldb/mysql.err
pid-file=/home/www/mysqldb/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true

# 初始化MySQL服务(datadir目录必须是空的)
sudo /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize

# 查看默认密码(如果没有则进日志mysql.err查看是否有报错)
sudo cat /home/www/mysqldb/mysql.err | grep password

# 启动mysqld
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
sudo service mysqld start

# 登陆(输入默认密码)
/usr/local/mysql/bin/mysql -u root -p
# 修改密码
ALTER USER USER() IDENTIFIED BY '密码';
# 允许外部访问
use mysql # 选择访问mysql库
update `user` set `host` = '%' where `user` = 'root'; # 使root能再任何host访问
FLUSH PRIVILEGES; # 刷新 

# 修改密码,MySQL 8默认使用了新的密码验证插件caching_sha2_password,而目前的PHP版本中所带的mysqlnd无法支持这种验证,所以指定为旧的mysql_native_password
ALTER USER "root"@"localhost" IDENTIFIED WITH mysql_native_password BY "密码";

# 查看当前的密码策略
SHOW VARIABLES LIKE 'validate_password%';
# 设置当前的密码策略
## 密码的强度验证等级:
#### 0/LOW: 只验证长度
#### 1/MEDIUM: 验证长度、数字、大小写、特殊字符
#### 2/STRONG: 验证长度、数字、大小写、特殊字符、字典文件
set global validate_password.policy=MEDIUM;
## 密码最小长度
set global validate_password.length=8;
## 整个密码中至少要包含大/小写字母的总个数
validate_password.mixed_case_count=1;
## 整个密码中至少要包含阿拉伯数字的个数
validate_password.number_count=1;
## 整个密码中至少要包含特殊字符的个数
set global validate_password_special_char_count=1;

# 授权远程访问
# 查看规则
select host,user from mysql.user \G;
# 修改规则 
update mysql.user set host= '%' where user = 'root';


# 重启
sudo service mysqld restart

目前PHP通过用户名密码连接MySQL的时候会报下面的错:

报错:PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]

这是由于用户身份认证的加密方式不兼容导致的,mysql8.0中默认方式为caching_sha2_password, 而目前的PHP版本中所带的mysqlnd无法支持这种验证, 引起老版本兼容性问题,老版本加密方式为mysql_native_password。 可以用下面的方法解决:

# 方法一:
ALTER USER USER() IDENTIFIED WITH mysql_native_password BY '密码';

# 方法二: 在`my.cnf`中增加下面的配置
default-authentication-plugin=mysql_native_password

配置

vim /etc/my.cnf

[mysqld]
# character-set-server=utf8mb4
# init_connect='SET NAMES utf8mb4'

# 默认存储引擎innoDB
default-storage-engine=INNODB

# mysql默认会反向解析DNS,对于访问者Mysql不会判断是hosts还是ip都会进行dns反向解析,频繁地查询数据库和权限检查,这大大增加了数据库的压力,
# 导致数据库连接缓慢,严重的时候甚至死机,出现“连接数据库时出错”等字样。解决办法:禁用dns反查即可
skip-name-resolve

# 指定加密方式!!!很重要,不然会报 PDOException: SQLSTATE[HY000] [2006] MySQL server has gone away
default_authentication_plugin=mysql_native_password

# 对mysql语句长度的限制
max_allowed_packet=4M

# 指定用户创建的内存临时表的最大值
max_heap_table_size=1024M

# 指定系统创建的内存临时表最大值
tmp_table_size=1024M

# 指定InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间,在表分区的时候很有必要
innodb_file_per_table=1

# 新密码不能和前面三次的密码相同
password_history=3
 
# 新密码不能和前面九十天内使用的密码相同
password_reuse_interval=90
 
# 默认为off;为on 时 修改密码需要用户提供当前密码 (开启后修改密码需要验证旧密码,root 用户不需要)
password_require_current=off

# 开启慢查询日志,默认值为OFF
slow-query-log=ON
# 慢查询日志的存储位置
slow_query_log_file="/home/www/logs/mysql_slow_query.log"
# 阀值,超过4秒的查询都将记录到慢查询日志中,默认10秒
long_query_time=4
# 未使用索引的查询也被记录到慢查询日志中,即使执行时间小于阀值,默认值为OFF
log_queries_not_using_indexes=ON
# 日志存储方式,默认值是'FILE','TABLE'表示将日志存入数据库mysql.slow_log表中,MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可:log-output='FILE,TABLE'
log-output="FILE"
# 是否将慢管理语句例如 ANALYZE TABLE 和 ALTER TABLE 等记入慢查询日志,默认值为OFF
log_slow_admin_statements=OFF

创建用户和授权

-- 给用户设定密码的两种方式
UPDATE user SET password = PASSWORD('your_password') WHERE user = 'username';
FLUSH PRIVILEGES;
SET PASSWORD FOR root@localhost = PASSWORD('your_password');

-- 创建用户并授权用户
create user 'username'@'localhost' identified by 'your_password';
create database database_name default character set = 'utf8' default collate = 'utf8_general_ci';
grant all privileges on database_name.* to 'username'@'localhost';
flush privileges;

忘记密码的处理

# 没有密码无法正常停止MySQL服务,只能杀进程
sudo pkill mysqld
# 打开一个终端执行如下命令,让root用户可以跳过授权
sudo mysqld --console --user=root --skip-grant-tables
# 再打开一个新的终端用于登录
mysql -uroot
# 登录后切换到mysql库
use mysql;
# 查看用户密码和授权
select user,host,authentication_string from user;
# 先刷新权限否则会出现错误: The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
flush privileges;
# 修改密码
ALTER USER 'root'@'%' IDENTIFIED BY '密码';
# 退出
quit
# 查找第一个终端的进程号,并杀掉
ps -ef |grep mysqld
kill 30842
# 启动MySQL服务
service mysqld start
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一米没有

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值