Ubuntu server 环境初始化

8

title: Ubuntu server 环境初始化
url: ubuntu-server-init-guide
date: 2023年12月04日
category: Linux
tags:

  • ubuntu

Ubuntu server 环境初始化

一、准备

  1. 腾讯云的云服务器开放端口,配置服务器的安全组,开放数据库、SSH的端口以便外部访问
  2. 更新系统
  3. 默认除root外,已经有了ubuntu用户,使用xshell登录
  4. ssh-keygen生成密钥
  5. 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

  1. 安装Nginx
sudo apt install nginx

sudo ufw allow 'Nginx Full'
  1. 配置 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
  1. 配置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

  1. 安装
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 })'
  1. 配置远程访问,要给数据库设置密码
//进入mongo cmd
sudo mongo

show dbs

use admin
db.createUser({user: "username",pwd: passwordPrompt(),roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase"]})

//输入密码

exit
  1. 编辑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

  1. 安装pm2:
sudo cnpm install pm2@latest -g
  1. 创建一个测试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}/`);
});
  1. 启动PM2
pm2 start hello.js

//保存当前管理的进程
pm2 save
  1. 配置开机自启

开机启动执行:

pm2 startup systemd

注意:如果使用 sudo pm2 startup systemd则是root用户创建的服务,之后要使用sudo pm2 startsudo 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

  1. 生成秘钥
ssh-keygen
  1. 免密登录

在本机电脑上执行以下命令,将本机的公钥拷贝到服务器。

ssh-copy-id -i .ssh/id_rsa.pub user@host
  1. 服务器秘钥变更时删除本地服务器指纹

服务器指纹就是服务器公钥的哈希值,查看服务器公钥指纹:

ssh-keygen -l -f ~/.ssh/id_rsa.pub

在本机上移除指定服务器的指纹:

ssh-keygen -R timetickme.com #指定域名或者IP

SSH 会将本机连接过的所有服务器公钥的指纹,都储存在本机的~/.ssh/known_hosts文件中。每次连接服务器时,通过该文件判断是否为陌生主机(陌生公钥)。

  1. Git clone

把本机的公钥添加到GitHub,克隆时使用Git协议而不是HTTPS。

  1. 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-highlightingzsh-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