目录
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