这是一篇私人折腾本地 Linux 的流程记录,主要是方便自己理解各个阶段碰到的问题。一旦未来出现某个 bug,这篇文章就可以为自己提供解决思路与参考。
1. 安装系统
宿主系统: Windows10
虚拟系统: Centos7
虚拟机软件: VirtualBox6.1
内存大小: 4GB
显存大小: 64MB
存储格式: VHD
存储明细: 动态分配存储
网卡一: NAT
网卡二: Host-Only
共享文件夹自动挂载: 是
挂载点: /root/share
安装方式: 最小化安装
安装语言: us-en
时区: 亚洲/上海
2. 设置网络
请参考 虚拟机网络配置,要连内网,更要连外网。
网络设置完成后,我们就可以利用 XShell 来登录虚拟系统了。
3. 增强功能
其实就是为了让宿主系统与虚拟系统的共享生效。步骤如下:
-
设置 yum 源为阿里云
# 备份原始源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下载阿里云源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 手动更新 CentOS-Base.repo 文件的 http 为 https vi /etc/yum.repos.d/CentOS-Base.repo # 清除缓存 yum clean all # 生成缓存 yum makecache # 更新 yum yum update -
安装必要的依赖
yum install gcc* yum install kernel-headers yum install kernel-devel -
在设置中的 存储-光驱 选中 VBoxGuestAdditions.iso 后,重新启动虚拟机后挂载 CDROM
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom -
进入目录安装增强功能
pushd /mnt/cdrom ./VBoxLinuxAdditions.run如果报错没有找到增强功能相关脚本,可以在 VirtualBox 的菜单中选择 设备 > 安装增强功能,把相关的脚本先加载到虚拟机中,再执行安装脚本。配合安装系统时的设置,我们会发现
/root/share目录已生成,到此,我们的宿主系统便可与虚拟系统相互传递文件了。 -
挂载共享文件夹 (如果重启后 share 目录未能自动挂载)
# 临时挂载。share 就是安装系统时指定的挂载点 mount -t vboxsf share ~/share # 设置自动挂载 vim /etc/rc.local在 rc.local 的最后一行加入下面的内容:
mount -t vboxsf share /root/share执行
:wq保存 rc.local 并退出后,为 rc.local 添加执行权限:chmod +x /etc/rc.local重启后即可发现 share 已自动挂载好了。
4. 安装 Docker
-
一键安装。如果成功,后面的分步安装应当省略
- 安装 Docker、Docker-Compose 并配置镜像加速
bash <(curl -f -s --connect-timeout 10 --retry 3 https://linuxmirrors.cn/docker.sh) --source mirrors.tencent.com/docker-ce --source-registry docker.1ms.run --protocol https --install-latested true --close-firewall false --ignore-backup-tips
- 安装 Docker、Docker-Compose 并配置镜像加速
-
分步安装。
-
更新系统软件包
yum update -
安装必要的软件包以允许 yum 使用 https
yum install -y yum-utils device-mapper-persistent-data lvm2 -
设置 docker 的稳定存储仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 替换 repo 文件中的原始下载为阿里云的下载地址 sed -i "s/download.docker.com/mirrors.aliyun.com\/docker-ce/g" /etc/yum.repos.d/docker-ce.repo # 将软件包信息提前在本地索引缓存,提升 yum 安装的速度 yum makecache fast -
安装最新版本的 docker engine 以及 containerd
yum install docker-ce docker-ce-cli containerd.io -
配置镜像加速
vim /etc/docker/daemon.jsondaemon.json 的内容如下:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://docker.1ms.run" ], "log-opts": { "max-size": "200m", "max-file": "3" } }如果上面配置的 registry-mirrors 不再生效,请执行以下命令以更新最新可用镜像源:
# 进入临时目录 cd /tmp # 配置 daemon.json 的 registry-mirrors 项 curl -s https://static.1ms.run/1ms-helper/scripts/install.sh | sudo bash /dev/stdin config:mirror由于不可描述之原因,docker 官方已经禁止大陆访问其服务器,因此,搜索镜像时应当采用
${镜像源域名}/${搜索关键字}的模式:docker search docker.1ms.run/mysql -
安装对应版本的 docker-compose (请根据已安装的 docker engine 版本选择合适的 docker-compose 版本)
curl -L "https://files.m.daocloud.io/github.com/docker/compose/releases/download/v2.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose细心的你可能发现了,docker-compose 的下载地址我并没有直接选择 github,而是选择了 daocloud 二进制文件下载站 作为中转。另外,各种镜像的下载也可以参考 daocloud 镜像仓库。
-
授予 docker-compose 执行权限
chmod +x /usr/local/bin/docker-compose -
创建软链接,使 docker-compose 命令生效
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
-
启动 docker
# 启动 docker 前,一定要先关闭防火墙 systemctl stop firewalld # 启动 docker systemctl start docker # 查看 docker 的运行状态,当看到 active (running) 时说明 docker 正在运行 systemctl status docker启动 docker 时你有可能遭遇失败,报错如
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.。那么,有可能是你的 /etc/docker/daemon.json 错写成了旧版配置文件名 /etc/docker/daemon.conf 了,改回来后再重启即可。 -
设置 docker 开机自启
systemctl enable docker -
验证 docker 是否已安装
docker -v -
验证 docker-compose 是否已安装
# 旧版 docker-compose -v # 新版 docker compose -v
5. 安装 Nginx
-
安装必要的软件包(如果之前未安装的话)
yum install yum-utils -
设置 yum 仓库,即创建一个名为
/etc/yum.repos.d/nginx.repo的文件并填写:[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true -
安装 nginx (默认安装 nginx-stable 版本),当看到获取的软件指纹为 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62,说明软件是安全的:
yum install nginx如果您发现上述的操作无法安装,请参考官网的最新安装指引。
因为是通过 yum 安装 nginx,因此默认的自定义配置文件位于
/etc/nginx/conf.d/default.conf。如果您希望使用自己写的默认配置文件如nginx.conf,则可以先删除原有的default.conf,然后再把您的nginx.conf放置于/etc/nginx/conf.d/目录中即可。 -
启动 nginx
systemctl start nginx -
设置 nginx 自启动
systemctl enable nginx -
检查 nginx 配置文件是否有问题
nginx -t
6. 配置 HTTPS
我们前面使用了 yum 安装 nginx,默认是没有安装 ssl 模块的。所以我们这里需要先安装一下。
同样因为我们使用 yum 安装的 nginx,所以我们需要下载一个同版本的可编译的 nginx。
-
查看 nginx 版本,比如 1.26.0,实际使用您的版本(下同)
nginx -V -
进入 opt 目录准备下载
cd /opt -
下载一个同版本的可编译的 nginx,比如 1.26.0 版本
wget http://nginx.org/download/nginx-1.26.0.tar.gz -
解压已下载的 nginx 软件包,然后进入解压得到的目录中
tar xf nginx-1.26.0.tar.gz && cd nginx-1.26.0 -
重命名原来的 nginx 应用文件作为备份文件
mv /usr/sbin/nginx /usr/sbin/nginx.bak -
复制一份原来的 nginx 应用配置文件作为备份文件
cp -r /etc/nginx{,.bak} -
继续在已解压的 nginx 目录中执行编译,目的是为了安装 ssl 模块
# 只安装 ssl 模块,执行该句 ./configure --with-http_ssl_module # 较为完整的安装,包括 stream、mail 等模块,则执行该句 ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-debug --with-stream -
以上编译时,如出现缺少依赖,一般需要安装以下模块,安装完再次编译
yum -y install libxml2 libxml2-dev libxslt-devel yum -y install gd-devel yum -y install perl-devel perl-ExtUtils-Embed yum -y install GeoIP GeoIP-devel GeoIP-data yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc -
编译通过后,继续验证
make这里千万要注意,不要继续输入执行
make install,以免现在的 nginx 被覆盖而出现问题 -
以上完成后,会在 objs 目录下生成一个 nginx 文件,先验证一下
/opt/nginx-1.26.0/objs/nginx -t -
验证时可能会报出一个目录
/var/lib/nginx/tmp/client_body不存在的错误,导致验证失败。我们就先创建该目录mkdir -p /var/lib/nginx/tmp/client_body -
把 objs 目录下的 nginx 文件放置到
/usr/sbin下,完成应用的替换cp /opt/nginx-1.26.0/objs/nginx /usr/sbin/ -
重启 nginx
nginx -s reload -
我们知道,nginx 的基本配置位于
/etc/nginx/nginx.con,nginx 的各个服务配置位于/etc/nginx/conf.d/*.conf,我们以/etc/nginx/conf.d/localhost.conf为例展示 HTTPS 的配置server { listen 80; server_name localhost; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name localhost; ssl_certificate /var/www/localhost.pem; ssl_certificate_key /var/www/localhost-key.pem; location / { root /var/www/demo; index index.html index.htm; } }
7. 安装 MySQL
-
先安装必要的依赖
yum -y install wget cmake make openssl-devel ncurses-devel -
进入 opt 目录,准备下载
cd /opt -
下载 MySQL 安装包
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44.tar.gz -
解压源码包并切换到解压后的目录
tar -zxvf mysql-5.7.44.tar.gz cd mysql-5.7.44 -
使用 cmake 配置 MySQL 安装选项,同时下载并使用 Boost 库
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNODB_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/opt/boost -
接下来便是编译和安装 MySQL
make && make install -
创建所需的目录及文件
# 创建数据存储目录 mkdir /usr/local/mysql/data/ # 创建数据日志目录 mkdir /usr/local/mysql/log/ # 创建临时文件目录 mkdir /usr/local/mysql/tmp/ # 创建运行文件目录 mkdir /usr/local/mysql/run/ # 创建启动日志错误 touch /usr/local/mysql/log/mysqld_safe_error.log # 创建默认的错误日志目的地 touch /usr/local/mysql/log/error.log # 创建慢查询日志文件 touch /usr/local/mysql/log/slow.log # 创建通用查询日志文件 touch /usr/local/mysql/log/general.log # 创建 mysqld 的 PID 文件 touch /usr/local/mysql/run/mysqld.pid -
配置
/etc/my.cnf,参考如下选项:# mysqld_safe 脚本启动时读取的配置 [mysqld_safe] # 存放 MySQL 后台程序 pid 的文件位置 pid-file=/usr/local/mysql/run/mysqld.pid # 启动错误日志 log-error=/usr/local/mysql/log/mysqld_safe_error.log # 数据目录 datadir=/usr/local/mysql/data # 本地 mysql 客户端程序的配置块 [mysql] # 本地 mysql 客户端连接的端口 port=3306 # 本地 mysql 客户端命令行提示信息 prompt=\\u@\\d \\r:\\m:\\s> # 本地 mysql 客户端字符集 default-character-set=utf8mb4 # 开启命令补全 no-auto-rehash # 所有 mysql 客户端程序读取的配置块 [client] # 连接端口 port=3306 # mysql 的主机和客户机在同一 host 上的时候,使用 unix domain socket 做为通讯协议的载体文件 socket=/usr/local/mysql/run/mysql.sock # mysql 服务端程序 mysqld、mysqld_safe 和 mysqld_multi 的配置文件 [mysqld] # 进程崩溃时生成 core file dump 文件,便于程序调试和问题排查 core-file # 该参数指定了安装 MySQL 的安装路径(mysql 安装目录),填写全路径可以解决相对路径所造成的问题。 basedir=/usr/local/mysql # 该参数指定 MySQL 的数据文件的存放目录,数据库文件即我们常说的 MySQL data 文件。 datadir=/usr/local/mysql/data # 临时目录 tmpdir=/usr/local/mysql/tmp # PID 文件 pid-file=/usr/local/mysql/run/mysqld.pid # 用于错误消息的区域设置。默认值是 en_US。服务器将参数转换为语言名,并将其与 lc_messages_dir 的值结合,以生成错误消息文件的位置。 lc_messages=zh_CN # 错误消息所在的目录。服务器使用该值和 lc_messages 的值来生成错误消息文件的位置。 lc_messages_dir=/usr/local/mysql/share # 默认的错误日志目的地。如果目标是控制台,则值为 stderr。否则,目标是一个文件,log_error 值是文件名。 log-error=/usr/local/mysql/log/alert.log # 慢查询日志文件名。默认值是 host_name-slow.log,但可以通过 slow_query_log_file 选项更改初始值。 slow_query_log_file=/usr/local/mysql/log/slow.log # 通用查询日志文件的名称。默认值是 host_name.log,但初始值可以通过 general_log_file 选项更改。 general_log_file=/usr/local/mysql/log/general.log # mysql 的主机和客户机在同一 host 上的时候,使用 unix domain socket 做为通讯协议的载体文件 socket=/usr/local/mysql/run/mysql.sock # 服务端字符集 character-set-server=utf8mb4 # 此变量控制写入错误日志的消息中的时间戳的时区,以及写入文件的一般查询日志和慢查询日志消息中的时间戳的时区。 log_timestamps=SYSTEM # 操作系统中可用于 mysqld 的文件描述符的数量。 open_files_limit=61535 # 同时允许的最大客户端连接数。 max_connections=1000 # mysql_stmt_send_long_data() C API 函数发送的一个包或任何生成/中间字符串的最大大小,或任何参数的最大大小。默认是 64MB。 max_allowed_packet=1G # 如果设置为 0,表名将按指定的方式存储,并且比较区分大小写。如果设置为 1,表名将以小写形式存储在磁盘上,比较不区分大小写。如果设置为 2,则表名按给定值存储,但以小写进行比较。此选项也适用于数据库名称和表别名。 lower_case_table_names=1 # 慢查询日志是否开启。取值为 0(或OFF) 表示关闭日志,取值为 1(或ON) 表示打开日志。默认值取决于是否给出—— slow_query_log 选项。日志输出的目标由 log_output 系统变量控制;如果该值为 NONE,则即使启用了日志,也不会写入任何日志项。 slow_query_log=1 # validate_password 插件的加载方法 plugin-load-add=validate_password.so # validate-password 在服务器启动时使用该选项来控制插件的激活 validate-password=FORCE_PLUS_PERMANENT -
创建 MySQL 用户和用户组
groupadd mysql useradd -r -g mysql -s /bin/false mysql -
设置 MySQL 文件权限
chown -R mysql:mysql /usr/local/mysql -
创建软链,使得 mysql 能作为命令使用
ln -s /usr/local/mysql/bin/mysql /usr/bin -
创建
/var/lib/mysql目录,为启动 MySQL 做准备mkdir -p /var/lib/mysql chmod 777 /var/lib/mysql -
接下来该初始化 MySQL 数据库了
cd /usr/local/mysql ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
请注意!上图红框圈中的是初始化数据库时生成的临时密码,该密码在后续步骤需要用到!
如果窗口没有显示临时密码,则可以执行
cat /usr/local/mysql/log/alert.log查看临时密码! -
启动 MySQL 服务
/usr/local/mysql/support-files/mysql.server start -
设置 MySQL 开机自启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on -
使用前面提到的临时密码登录 MySQL
mysql -u root -p -
重置 root 用户登录密码
# 设置密码验证安全级别 set global validate_password_policy=LOW; # 设置密码验证最小长度,这里改为4 set global validate_password_length=4; # 设置密码为 000000,具体密码看您需要 alter user root@localhost identified by '000000'; -
允许远程访问,如 Navicat 连接。注意,这里的命令是在 MySQL 中执行,不是系统命令
# 选择 mysql 库 use mysql; # 将 root 用户的可访问主机改为 %,即任何主机 update user set user.Host='%' where user.User='root'; # 执行生效指令 flush privileges; # 退出登录即可 exit;