个人建站记录

服务器

阿里云ECS,1核/1G内存/1Mbps,网络类型:专有网络,系统选择了 uBuntu 16.04

服务器默认安全组只开启了223389端口,需要手动添加需要的端口。

服务器默认为 root 用户,以下指令无说明都在 root 用户下执行。


SSH登录

为服务器配置ssh密钥登录,方面使用本地Terminal操作。

生成 ssh key,若有则跳过

1
# ssh-keygen

可以通过在 ssh key 默认路径下查看是否有 id_dsaid_dsa.pub 来判断是否已经生成过默认ssh key

  • Mac/Linux 位于 ~/.ssh 目录下
  • Windows 位于 %USERPROFILE%/.ssh 目录下

查看公钥指纹

1
2
3
4
# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp8l9SFxth9JCpNSWIcgwVlkpk8pU+46lS
r/D5UeF7xmftzRlFRTzQ1+KZGDiAVMBQv+vbreFV9YI1Z3JrWgnr+ltSvU94NlQ03O1uiRVH
...BeiSye3vcRSx [email protected]

上传公钥

在阿里云控制台创建密钥对,创建过程中需要第2步中获取到的公钥指纹。最后将服务器绑定创建的密钥对。

ssh 登录

命令:ssh [email protected],其中 root 为登录的用户名,xxx.xxx.xxx.xxx 为服务器的外网 IP。

在设备首次登录时,询问是否信赖远程服务器的公钥指纹,形如:

1
2
3
4
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:DkQ1VS2CH6W1eYhN9V+nVCD0dr/Jp3n3A2Ynj1FJ5PM.
Are you sure you want to continue connecting (yes/no)?

输入 yes,会将服务器记录至 /.ssh/konwn_host 中,下次登录不再询问。

如何验证服务器的公钥指纹?

服务器的密钥对默认存储在 /ect/ssh 目录下

1
2
3
4
5
6
7
8
9
10
11
12
# ls -l /etc/ssh
total 332
-rw-r--r-- 1 root root 300261 Aug 12 2016 moduli
-rw-r--r-- 1 root root 1756 Aug 12 2016 ssh_config
-rw-r--r-- 1 root root 2389 Aug 23 14:13 sshd_config
-rw------- 1 root root 668 Aug 18 10:20 ssh_host_dsa_key
-rw-r--r-- 1 root root 618 Aug 18 10:20 ssh_host_dsa_key.pub
-rw------- 1 root root 227 Aug 18 10:20 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 190 Aug 18 10:20 ssh_host_ecdsa_key.pub
-rw------- 1 root root 1675 Aug 18 10:20 ssh_host_rsa_key
-rw-r--r-- 1 root root 410 Aug 18 10:20 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 338 Jul 11 14:38 ssh_import_id

例如我的服务器返回的是 ECDSA key fingerprint,那就查阅 ssh_host_ecdsa_key.pub 的指纹

1
2
ssh-genkey -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:DkQ1VS2CH6W1eYhN9V+nVCD0dr/Jp3n3A2Ynj1FJ5PM root@iZuf67k5jsgaj2jjcw4e01Z (ECDSA)

若服务器返回的是 MD5 指纹,也可指明离散方法

1
2
# ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:a1:2f:18:cd:21:c1:ca:fe:1e:7f:fd:c8:b4:d5:e2:d9 root@iZuf67k5jsgaj2jjcw4e01Z (ECDSA)

为服务器添加别名

可以为服务器添加本地别名,免去输入复杂的 ip 地址。在 /.ssh/config (若无则需要手动创建)中添加别名记录:

1
2
3
4
5
Host server # 别名
HostName xxx.xxx.xxx.xxx # 服务器地址
User root # 用户名
IdentitiesOnly yes # 只接受 ssh 登录
IdentityFile keyPath # 指定密钥路径,使用默认密钥时无需添加

添加完别名后,就可以在终端中使用:ssh server 命令,快速到服务器了。


配置 Java

检查是否已配置 JRE/JDK

使用命令:java -version,若出现:

1
2
3
4
5
6
7
8
9
# java -version
The program 'java' can be found in the following packages:
* default-jre
* gcj-5-jre-headless
* openjdk-8-jre-headless
* gcj-4.8-jre-headless
* gcj-4.9-jre-headless
* openjdk-9-jre-headless
Try: apt install <selected package>

则未配置 java 环境。

安装 FTP

由于 ubuntu 使用 apt-get 安装 default-jdkOpenJDK。尝试使用 ppa 安装多次失败,无法找到 oracle jdk package。最后只好采用 FTP 上传安装包手动上传。

安装 vsftpd

1
# apt-get install vsftpd

创建 ftp 专用用户

创建 FTP 用户 fpter,并指定用户的主目录 /home/ftper,设置密码为 ftperpwd

1
2
# useradd -d /home/ftper ftper
# passwd ftperpwd

限定 ftper 用户只可用 ftp

1
# usermod -s /sbin/nologin ftper

创建 ftp 上传目录

创建 /home/ftper/data 目录,作为 ftp 上传的目录,并修改拥有者为 ftper 用户

1
2
# mkdir /home/ftper/data
# chown -R ftper /home/ftper/data

配置 vsftpd

修改配置 vsftpd.conf,适用于 v3.0.3,更多设置查看官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 禁止匿名用户
anonymous_enable=NO
# 允许本地用户
local_enable=YES
# 允许写权限
write_enable=YES
# 使用 chroot 限制用户访问权限
chroot_local_user=YES
# 不设置 chroot 例外用户
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
# 设置 vsftpd service 使用的用户
pam_service_name=ftper
# 设置固定目录
local_root=/home/ftper/data
# 限定被动端口范围
pasv_min_port=50000
pasv_max_port=60000

配置 chroot 目录

从 vsftpd 2.3.5 开始,强制要求 chroot 根目录不可写

1
# chmod 550 /home/ftper/data

创建 upload 目录用于上传,并确保为可写权限

1
2
# mkdir /home/ftper/data/upload
# chmode 750 /home/ftper/data/upload

重启 vsftp

1
# service vsftpd restart

开放服务器端口

在管理控制台为 ECS 所在安全组添加允许 21 端口和 50000-60000 端口

推荐新建专用于 ftp 的安全组,方便开启关闭 ftp 端口

下载 JRE/JDK

Oracle 官网 下载安装包,以 server-jre-8u144-linux-x64.tar.gz 为例

上传 JRE/JDK 至服务器

复制到 /usr/lib/java 目录下,并解压

1
2
3
4
5
6
7
8
# mkdir /usr/lib/java
# cp /home/ftper/data/jdk/server-jre-8u144-linux-x64.tar.gz /usr/lib/java/server-jre-8u144-linux-x64.tar.gz
# cd /usr/lib/java
# tar zxvf server-jre-8u144-linux-x64.tar.gz
# ls
jdk1.8.0_144 server-jre-8u144-linux-x64.tar.gz

添加环境变量

修改 /etc/environment,添加如下的环境变量

1
2
3
JAVA_HOME="/usr/lib/java/jdk1.8.0_144"
CLASSPATH="$JAVA_HOME/lib"
PATH="$JAVA_HOME/bin"

安装 Java

1
# update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.8.0_144/bin/java 300

检查是否安装成功

1
2
3
4
# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

配置 MySQL

检查是否已经安装 MySQL

1
# myshqladmin --version

安装 MySQL

1
# apt-get install mysql-server mysql-client

安装过程中会要求设置 MySQL root 用户的密码

检查是否成功启动

查看 MySQL 进程信息

1
2
# ps -aux | grep mysql
mysql 751 0.0 15.6 1109848 158916 ? Ssl 15:28 0:01 /usr/sbin/mysqld

1
2
# ps -ef | gerp mysql
mysql 751 1 0 15:28 ? 00:00:01 /usr/sbin/mysqld

本地登录 MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 33
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

配置远程登录

确实是否开启3306端口

MySQL 默认关闭3306端口,需要确认当前是否开启

1
2
# netstat -an | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN

上述结果表示 MySQL 只监听本地 127.0.0.1 端口

修改配置

查看 /etc/mysql/my.cnf
修改或添加

1
2
3
[mysqld]
...
bind-address = 0.0.0.0

注意 不要采用大部分博客中所说的注释掉 bind-address = 127.0.0.1

/etc/mysql/my.cnf 默认含有

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

意味着 MySql 首先会加载 /etc/mysql/conf.d//etc/mysql/mysql.conf.d/ 中的配置文件,再加载 /etc/mysql/my.cnf,若有冲突则覆盖。
注释 /etc/mysql/my.cnf 中的 bind-address = 127.0.0.1,MySql 则会加载默认配置,从而无法达到修改效果。

重启 MySql

1
# service mysql restart

重启后再次查看 3306 端口状况

1
2
# netstat -an | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN

上述结果表示 3306 端口正在监听所有 IP,表明修改成功。

授权远程用户访问

使用 root 身份本地登录 MySQL 后添加远程授权

1
2
3
4
5
# mysql -u root -p
Enter password:
mysql> grant [privilege1],...,[privilege2] on [database].[table] to [user]@[ip] identified by '[password]';
Query OK, 0 rows affected (0.00 sec)
  • [privilege1],...,[privilege2] 为允许的操作,包括:selectinsertupdatedeletecreatedropindexaltergrant,referencesreloadshutdownprocessfileall privileges 表示所有操作。
  • [database] 为数据库名,[table] 为表明,用 * 表示所有;
  • [ip] 为允许访问的 IP 地址,'%' 表示任意地址,localhost127.0.0.1 表示本地,用 xxx.xxx.xxx.xxx 表示具体地址;
  • [user] 为登录用户名, [password] 为登录密码。

示例:

1
mysql> grant all privileges on *.* to sqler@localhost identified by ‘123456′;

允许 root 用户在本地对任意数据库的任意表进行所有数据库操作

1
mysql> grant select,insert,update,delete,create,drop on user.* to sqler@'%' identified by ‘123456′;

允许 sqler 用户在任意 IP 对 user 数据库的任意表进行 select、insert、update、delete、create、drop 等数据库操作

1
mysql> grant all privileges on user.* to [email protected] identified by ‘123456′;

允许 sqler 用户在 139.224.xxx.xxx IP 对 user 数据库的任意表进行所有数据库操作

添加用户操作权限后,执行

1
2
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

立刻刷新,使设置生效,之后便可进行远程操作 MySql 了。