这是一篇私人折腾本地 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
-
更新系统软件包
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.conf
daemon.conf 的内容如下:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://dockerproxy.com" ], "log-opts": { "max-size": "200m", "max-file": "3", "compress": true } }
-
启动 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.conf 错写成了旧版配置文件名 /etc/docker/daemon.json 了,改回来后再重启即可。 -
设置 docker 开机自启
systemctl enable docker
-
验证 docker 是否已安装
docker -v
-
安装对应版本的 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-compose 是否已安装
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;