Ubuntu server 环境初始化
title: Ubuntu server 环境初始化
url: ubuntu-server-init-guide
date: 2023年12月04日
category: Linux
tags:
ubuntu
Ubuntu server 环境初始化
一、准备
- 腾讯云的云服务器开放端口,配置服务器的安全组,开放数据库、SSH的端口以便外部访问
- 更新系统
- 默认除root外,已经有了ubuntu用户,使用xshell登录
- ssh-keygen生成密钥
- ufw设置
sudo ufw allow OpenSSH
sudo ufw enable
二、安装Redis
sudo apt install redis-server
编辑redis配置文件,修改守护进程用systemd,supervised systemd
sudo nano /etc/redis/redis.conf
sudo systemctl restart redis.service
sudo systemctl status redis.service
注意:默认redis配置中的日志文件是记录在logfile /var/log/redis/redis-server.log
这个位置的,我的电脑/var挂载在另一块单独的硬盘,安装后没能自动创建这个日志文件的目录,导致服务失败了。手动创建/var/log/redis/redis-server.log
并且sudo chown -R redis:redis /var/log/redis/
,重新启动就可以了。
三、安装MySQL
参照:How To Install MySQL on Ubuntu 20.04
- 安装
sudo apt install mysql-server
sudo mysql_secure_installation
```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '123456';
根据提示初始化数据库设置。
- 创建用户
MySQL默认是禁止root用户远程登录的,创建用户从任意主机访问MySQL
输入sudo mysql
进入命令行
CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'passwd';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
//修改密码
ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
MariaDb SQL
CREATE USER 'honeymoose'@'%' IDENTIFIED BY '12345678';
GRANT USAGE ON *.* TO 'honeymoose'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'honeymoose'@'%' IDENTIFIED BY '12345678' WITH GRANT OPTION;
FLUSH PRIVILEGES;
- 测试新用户连接正常
mysql -u username -p
sudo systemctl status mysql.service
sudo mysqladmin -p -u username version
- 远程访问
修改MySQL配置文件,bind-address改为0.0.0.0
,重启MySQL服务
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
- 配置防火墙
sudo ufw allow 3306
sudo service mysql restart
四、安装Node.js
参照:How To Install Node.js on Ubuntu 20.04 | DigitalOcean
cd ~
curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt install nodejs
sudo npm install -g cnpm --registry=https://registry.npmmirror.com
五、安装Nginx & Let's encrypt
- 安装Nginx
sudo apt install nginx
sudo ufw allow 'Nginx Full'
- 配置 server block
创建网站目录并配置:
sudo mkdir -p /var/www/timetickme.com/html
sudo chown -R $USER:$USER /var/www/timetickme.com/html
sudo chmod -R 755 /var/www/timetickme.com/html
sudo nano /var/www/timetickme.com/html/index.html
sudo nano /etc/nginx/sites-available/timetickme.com
/etc/nginx/sites-available/timetickme.com
文件填入内容如下:
server {
listen 80;
listen [::]:80;
root /var/www/timetickme.com/html;
index index.html index.htm index.nginx-debian.html;
server_name timetickme.com www.timetickme.com;
location / {
try_files $uri $uri/ =404;
}
}
修改server_names_hash_bucket_size ,sudo nano /etc/nginx/nginx.conf
,修改部分如下;
http {
...
server_names_hash_bucket_size 64;
...
}
启用配置,重启服务
sudo ln -s /etc/nginx/sites-available/timetickme.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
- 配置let's encrypt
参照:How To Secure Nginx with Let's Encrypt on Ubuntu 20.04 | DigitalOcean
要让let‘s encrypt能自动配置,要按照第二步的规则在nginx添加server block
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d timetickme.com -d www.timetickme.com
//查看自动续期
sudo systemctl status certbot.timer
//测试自动续期
sudo certbot renew --dry-run
六、安装MongoDB
- 安装
curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt update
sudo apt install mongodb-org
sudo systemctl start mongod.service
//测试连通
mongo --eval 'db.runCommand({ connectionStatus: 1 })'
- 配置远程访问,要给数据库设置密码
//进入mongo cmd
sudo mongo
show dbs
use admin
db.createUser({user: "username",pwd: passwordPrompt(),roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase"]})
//输入密码
exit
- 编辑mongo配置文件
sudo nano /etc/mongod.conf
//修改使用授权
------------------------------------------------------
security:
authorization: enabled
------------------------------------------------------
------------------------------------------------------
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
------------------------------------------------------
重启服务:
sudo systemctl restart mongod
sudo ufw allow 27017
注意:在腾讯云控制台要开放27017端口。
七、配置fail2ban
安装:
sudo apt install fail2ban -y
sudo systemctl status fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
修改 [DEFAULT]
块中配置,改为合适的值:
bantime = 1d
findtime = 1d
maxretry = 5
配置Jail(监狱),修改 [sshd]
区块的配置,添加:
enabled = true
maxretry = 3
```
sudo systemctl restart fail2ban
//查看ban情况
sudo fail2ban-client status sshd
八、配置PM2
参照:How To Set Up a Node.js Application for Production on Ubuntu 20.04 | DigitalOcean
- 安装pm2:
sudo cnpm install pm2@latest -g
- 创建一个测试node程序:
const http = require('http');
const hostname = 'localhost';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World!\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
- 启动PM2
pm2 start hello.js
//保存当前管理的进程
pm2 save
- 配置开机自启
开机启动执行:
pm2 startup systemd
注意:如果使用 sudo pm2 startup systemd
则是root用户创建的服务,之后要使用sudo pm2 start
和sudo pm2 list
,而pm2 startup systemd
是当前用户创建的服务,两者不一样。
根据提示,要创建systemd,执行如下命令
Output
[PM2] Init System found: systemd
sammy
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
创建systemd服务名称为pm-<你登陆的用户名>
sudo systemctl start pm2-ubuntu
systemctl status pm2-ubuntu
如果遇到pid文件打开权限问题,重启服务器尝试
九、配置rsync备份
同步远程文件到本地:
//参数 -a 同步文件属性,-z 压缩,-P 同步的过程进度,--delete 保持一致
rsync -azP --delete dir1 ubuntu@timetickme.com:/home/ubuntu/rsync_test
设置定时任务,定时执行该命令。
1.备份MySQL
- 导出数据库:
/usr/local/mysql/bin/mysqldump -u 用户名 -p 数据库名 > 文件名.sql
文件名可以用绝对路径。
- 导入数据库
/usr/local/mysql/bin/mysql -u 用户名 -p 数据库名 < 文件名.sql
注意,导入的数据库名必须存在,如果不存在的话先要手动创建数据库或者将创建数据库的代码写在sql文件里。
2.备份MongoDB
mongodump and mongorestore commands need the name of database where mongodb user's credentials are stored.
所以要加参数 --authenticationDatabase admin
备份一个数据库:
mongodump -h 127.0.0.1 -p 27017 -u username -p passwd -d test -o /home/ubuntu/temp --authenticationDatabase admin
恢复数据:
mongorestore -h 127.0.0.1 -p 27017 -u username -p passwd -d test /home/ubuntu/temp/test/ --authenticationDatabase admin
使用rsync同步备份的数据目录。
十、配置SSH,Git
- 生成秘钥
ssh-keygen
- 免密登录
在本机电脑上执行以下命令,将本机的公钥拷贝到服务器。
ssh-copy-id -i .ssh/id_rsa.pub user@host
- 服务器秘钥变更时删除本地服务器指纹
服务器指纹就是服务器公钥的哈希值,查看服务器公钥指纹:
ssh-keygen -l -f ~/.ssh/id_rsa.pub
在本机上移除指定服务器的指纹:
ssh-keygen -R timetickme.com #指定域名或者IP
SSH 会将本机连接过的所有服务器公钥的指纹,都储存在本机的~/.ssh/known_hosts
文件中。每次连接服务器时,通过该文件判断是否为陌生主机(陌生公钥)。
- Git clone
把本机的公钥添加到GitHub,克隆时使用Git协议而不是HTTPS。
- SCP远程复制
scp source destination
scp user@host:foo.txt bar.txt
上面命令将远程主机(user@host
)用户主目录下的foo.txt
,复制为本机当前目录的bar.txt
。主机与文件之间要使用冒号(:
)分隔。
# 将本机的 documents 目录拷贝到远程主机
# 会在远程主机创建 documents 目录
$ scp -r documents username@server_ip:/path_to_remote_directory
https://hexo.io/zh-cn/index.html)
十一、Nginx反向代理Node
创建一个配置文件:
sudo vim /etc/nginx/sites-available/api_test
填入以下内容:
server {
listen 80;
server_name api.timetickme.com/;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
proxy_pass http://localhost:3000;
是运行在同一台服务器上的Node服务。
使配置生效:
sudo ln -s /etc/nginx/sites-available/api_test /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
十二、ZSH
1.安装zsh
sudo apt install zsh
chsh -s $(which zsh)
2.安装oh-my-zsh,参照GitHub上的说明。
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
3.安装插件:zsh-syntax-highlighting,zsh-autosuggestions,参照链接中的说明。
4.目录跳转autojump
sudo apt install autojump
除了在还要在~/.zshrc
中配置plugins,还要将下面这句写到文件中:
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
5.多用户
通过软连接,root用户使用普通用户的配置
# 当前为pi用户
sudo ln -s $HOME/.oh-my-zsh /root/.oh-my-zsh
sudo ln -s $HOME/.zshrc /root/.zshrc
在.zshrc中加入这句,不然会有权限错误提示
ZSH_DISABLE_COMPFIX=true
参照:https://www.mintimate.cn/2021/02/05/configZsh/#%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85zsh
6.其他
Note:异常关机后,重新打开终端提示错误corrupt history file /home/yinnan/.zsh_history
,修复损坏的zsh_history,参照:https://shapeshed.com/zsh-corrupt-history-file/
#!/usr/bin/env zsh
# Fixes a corrupt .zsh_history file
mv ~/.zsh_history ~/.zsh_history_bad
strings -eS ~/.zsh_history_bad > ~/.zsh_history
fc -R ~/.zsh_history
rm ~/.zsh_history_bad