Ubuntu服务器使用记录

为方便查看目录,请翻阅到文章末尾 (简书目前不支持锚点,用脚注实现类似目录)

1.windows下使用putty工具[1]

登录ubuntu,用户名:root,密码:(输入密码时控制台并没有反应,尽管输入,回车之后就能知道输入的正不正确),linux哲学:没有消息就是最好的消息.

2.windows下使用WinSCP作为文件可视化工具[2]

官网
WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件

3.创建root,并使用root登录[3]

创建并修改root密码:
sudo passwd root,
输入两次密码之后即可.
修改ssh配置,(此处使用vim编辑,基本操作:x删除当前字符,i切换为insert模式,esc退出insert模式,:qa!不保存退出,:wq保存退出 .. 这些命令基本够用了)
sudo vim /etc/ssh/sshd_config
将PermitRootLogin属性改为yes

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

然后重启ssh服务
sudo service ssh restart

4.安装fish [4]

fish shell入门教程
fish 是Ubuntu下非常好的一款shell,因为它能检查你输入的命令是否正确,安装如下:
sudo apt-get install fish
查看 fish shell 的安装位置:which fish => ``
此处建议每次手动进入fish命令,因为bash和fish的命令不是完全兼容.进入命令:fish,退出命令:exit,

5.安装docker [5]

官网安装指南
sudo docker run hello-world 输出 Hello from docker 字样则为安装成功
docker version

启用阿里镜像加速器:
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是阿里云的镜像地址:
参考阿里云官网介绍:https://help.aliyun.com/document_detail/60750.html
注意使用bash命令,而不是fish
进入控制台后选择=>镜像中心=>镜像加速器,按照说明一步一步输入命令即可,注意:命令行下换行就是回车,一定要回车,不然命令不对,https://cr.console.aliyun.com/cn-qingdao/instances/mirrors

1.获取加速地址https://xxxxxxx.mirror.aliyuncs.com(换成自己申请的)
2.修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker # 如果没有daemon.json
#命令行操作,写入内容
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF

如果不太会命令行方式,可以直接用winscp打开daemon.json文件,将内容写入保存
重新加载配置文件,然后重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

完成配置

TODO:使用阿里云镜像仓库管理镜像

Docker 常用命令

  • 启动docker
    sudo service docker start
  • 停止docker
    sudo service docker stop
  • 重启docker
    sudo service docker restart
  • 列出Docker CLI命令
    docker
    docker container --help
  • 显示Docker版本和信息
    docker --version
    docker version
    docker info
  • Execute Docker image
    docker run hello-world
  • 列出镜像列表
    docker image ls
  • 列出docker容器 (running, all, all in quiet mode)
    docker container ls
    docker container ls --all
    docker container ls -aq

安装并使用docker-compose 官网=>docker-compose install

  • 安装sudo apt install docker-compose

6. docker配置nginx[6]

docker pull nginx
下载完成后,使用docker images 查看下载的nginx 镜像

启动一个名为nginx(名字自己根据需求起名字,一般见名知意即可) 的容器 docker run --name nginx -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html nginx

默认容器对这个目录有可读写权限,可以通过指定ro,将权限改为只读(readonly) # docker run --name my-nginx -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html:ro -d nginx

7.1 安装mysql (8.x之前版本) [7]

提示:以下操作均在root权限下进行。
查看有没有安装MySQL:
dpkg -l | grep mysql

安装MySQL:
apt install mysql-server
安装完之后可以使用如下命令检查是否安装成功:
netstat -tap | grep mysql
通过上述命令检查之后,如果看到有 mysql 的socket处于 LISTEN 状态则表示安装成功。
登录mysql数据库
mysql -u root -p
-u 表示选择登陆的用户名, -p 表示登陆的用户密码,现在是mysql数据库是没有密码的,Enter password:处直接回车,就能够进入mysql数据库。

然后通过 show databases; 就可以查看当前的所有数据库。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

接下来,为了确保数据库的安全性和正常运转,对数据库进行初始化操作。这个初始化操作涉及下面5个步骤。
(1)安装验证密码插件。
(2)设置root管理员在数据库中的专有密码。
(3)随后删除匿名账户,并使用root管理员从远程登录数据库,以确保数据库上运行的业务的安全性。
(4)删除默认的测试数据库,取消测试数据库的一系列访问权限。
(5)刷新授权列表,让初始化的设定立即生效。

对于上述数据库初始化的操作步骤,在下面的输出信息旁边我做了简单注释。

root@VM-0-6-ubuntu ~# mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: y # 验证密码强度插件

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0 # 密码强度,我选择了low
Please set the password for root here.  
New password: # 设置root用户密码
Re-enter new password:

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y 
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 移除匿名账户
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n # 是否禁用远程root登录,我选择了no

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y #移除测试数据库,并取消对它的访问权限
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y # 刷新授权表,让初始化后的设定立即生效
Success.

All done!

检查mysql服务状态
systemctl status mysql
显示如下结果说明mysql服务运行正常:

● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Wed 2020-01-01 21:39:34 CST; 8min ago
 Main PID: 20771 (mysqld)
    Tasks: 29 (limit: 4915)
   CGroup: /system.slice/mysql.service
           └─20771 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pi

再次用mysql -u root -p命令,Enter password:处输入刚设置的密码,回车,就能够进入mysql数据库。

使用 use mysql; 命令打开mysql命名的数据库,显示当前数据库的表:show tables; 查询user表里的数据:select * from user;(user表里是mysql数据库的所有账户信息)

配置mysql允许远程访问,首先编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件:
vim /etc/mysql/mysql.conf.d/mysqld.cnf

注释掉bind-address = 127.0.0.1
保存退出,然后进入mysql数据库,执行授权命令:
mysql -u root -p
mysql> grant all on . to root@'%' identified by '你的密码' with grant option;注:mysql8.0之后已不适用
mysql>CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
mysql>grant all privileges on *.* to 'root'@'%';
mysql> flush privileges; # 刷新权限
mysql> exit #退出mysql服务
执行如下命令重启mysql:
systemctl restart mysql
在windows上使用navicat连接即可

7.2 安装mysql(8.x及之后版本)

  • 安装:
    在ubuntu中安装mysql只要一行命令就可以了 sudo apt install mysql-server
  • 配置:

注意事项:不需要像其他平台那样开启服务,因为已经默认开启
不需要做的事情:启动和设置开机启动, 这两件事情已经通过apt自动完成了,并且服务名叫做mysql,而不是mysqld

  • 登录:
    直接进入mysql,命令:sudo mysql
  • 本地 root 用户
    到了关键的一步,其实现在你的数据库中就有一个叫做 host 字段为 localhost 的 root 的用户我们需要做如下几件事情:

修改初始 root 用户的密码(修为我们自己的密码)
不需要授予访问权限等操作,因为默认已经有了

  • 重置密码
    重置 root 账户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
  • 刷新权限
    命令:FLUSH PRIVILEGES;
  • 远程root 用户
    如果需要远程登陆:
  1. 创建一个 host 字段为 % 的 root 用户(创建用户的同时设置密码)
  2. 授权所有数据库的访问权限
  3. 刷新权限列表

有些 uu 就会很奇怪为什么要创建两个 root 用户呢?这个和 mysql 的用户管理方式有关系:localhost 表示本机登录;% 表示远程登陆。
如果 root 用户只有 % ,那就只能除了本机外的其他计算机才能登陆 mysql server,如果用户只有 localhost,那只有本机可以登录,远程计算机不能登录 mysql server
那么 mysql 为什么要这么设计呢?可能是为了安全吧!这样我们可以为 root 设置两个不同的密码,localhost 环境下设置一个很简单的密码;% 环境下就可以极其复杂

  • 新建一个 host 为 % 的 root用户,密码随意
    create user 'root'@'%' identified by 'yourpassword';
  • 授权
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  • 刷新权限
    FLUSH PRIVILEGES;
  • 远程连接
    光设置需要登陆用户的 host 为 % 是不够的,因为 mysql 的配置文件中禁止了远程登录,需要去修改一下配置文件。
  • 先关停mysql服务
    sudo systemctl stop mysql
  • 编辑mysql配置文件
    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
  • 注释掉
    #bind-address = 127.0.0.1
  • 启动mysql服务即可
    此时,既可以本地(直接物理机的终端上,或者ssh连接至物理机),又可以远程

8.监控mysql正在执行的sql和日志[8]

  • 在linux下进入mysql
    mysql -u root -p 输入密码后进入mysql控制台

  • 查看日志开关状态
    show variables like "general_log%";

mysql> show variables like "general_log%";
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | OFF                                |
| general_log_file | /var/lib/mysql/VM-16-14-ubuntu.log |
+------------------+------------------------------------+
2 rows in set (0.00 sec)
  • 可以通过如下语句开启
    set global general_log="on";
mysql> set global general_log = "on";
Query OK, 1 rows affected (0.00 sec)

mysql> show variables like "general_log%"; # 再次查看general_log 已为ON
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | ON                                 |
| general_log_file | /var/lib/mysql/VM-16-14-ubuntu.log |
+------------------+------------------------------------+
2 rows in set (0.00 sec)
  • 退出mysql在bash命令行中用tail -f {fileName}命令查看实时执行的sql
root@VM-16-14-ubuntu ~# tail -f /var/lib/mysql/VM-16-14-ubuntu.log
2020-01-08T15:00:56.956671Z       676 Query     SHOW FULL PROCESSLIST
2020-01-08T15:01:01.957452Z       676 Query     SHOW FULL PROCESSLIST
2020-01-08T15:01:11.955173Z       676 Query     SHOW FULL PROCESSLIST

也可以直接用winSCP查看该log文件的日志记录
TODO: 将log日志放到data盘, 修改/etc/mysql/mysql.conf.d/mysqld.cnf文件

general_log_file        = /data/log/mysql/mysql.log # 修改路径
#general_log             = 1

/data/log/mysql/位置新建mysql.log文件,(注意此时用的时root用户,后面会有权限问题)

重启服务 (3种方式选择其一)
service mysql restart
or systemctl restart mysql
or /etc/init.d/mysql restart
进入mysql mysql执行命令
set global general_log="on";
报错:

ERROR 29 (HY000): File '/data/log/mysql/mysql.log' not found (Errcode: 13 - Permission denied)

显示没有权限,
然后给mysql.log文件权限

chown -R mysql.mysql /data/log/mysql/mysql.log

仍然报相同的错误,此时就走不下去了,如有知道的,望告知,不胜感谢.

9.安装redis[9]

Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速。用Redis可以很轻松解决高并发的数据访问问题;作为实时监控信号处理也非常不错。

  • 安装Redis服务器端
    sudo apt-get install redis-server
    安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序
  • 检查Redis服务器系统进程
    ps -agx|grep redis
  • 通过启动命令检查Redis服务器状态
    netstat -nlt|grep 6379
  • 通过启动命令检查Redis服务器状态
    sudo /etc/init.d/redis-server status
  • 通过命令行客户端访问Redis
    安装Redis服务器,会自动地一起安装Redis命令行客户端程序。
    在本机输入redis-cli命令就可以启动,客户端程序访问Redis服务器。
  • 修改Redis的配置
    使用Redis的访问账号
    默认情况下,访问Redis服务器是不需要密码的,为了增加安全性我们需要设置Redis服务器的访问密码。设置访问密码为redisredis。
    用vim打开Redis服务器的配置文件redis.conf
    vim /etc/redis/redis.conf
    取消注释requirepass
    requirepass mypassword
    让Redis服务器被远程访问
    默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。
    用vim打开Redis服务器的配置文件redis.conf
    sudo vi /etc/redis/redis.conf
    注释bind
    #bind 127.0.0.1
    修改后,重启Redis服务器。
    sudo /etc/init.d/redis-server restart
    尝试不适用密码登录
    redis-cli
    发现可以进入,继续执行查询命令
    keys *
    发现(error) NOAUTH Authentication required.没有权限了.
    然后使用密码登录
    redis-cli -a mypassword
    然后执行命令
    keys *
    现在可以执行了
  • 检查Redis的网络监听端口
    netstat -nlt|grep 6379
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp6       0      0 :::6379                 :::*                    LISTEN

我们在远程的另一台Linux访问Redis服务器
redis-cli -a redisredis -h 192.168.1.199
redis 192.168.1.199:6379> keys *
远程访问正常

10.安装和配置nginx[10]

  • 安装nginx
    nginx的软件包在Ubuntu默认软件仓库中可用。 安装非常简单,只需键入以下命令
sudo apt update
sudo apt install nginx

安装完成后,
如果忘记nginx的配置文件位置,可以用nginx -t命令查看,显示如下:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

请检查Nginx服务的状态和版本
sudo systemctl status nginx
sudo nginx -v
使用systemctl管理Nginx服务
您可以像任何其他systemd单位一样管理Nginx服务。 要停止Nginx服务,请运行:
sudo systemctl stop nginx
要再次启动,请键入:
sudo systemctl start nginx
重新启动Nginx服务:
sudo systemctl restart nginx
在进行一些配置更改后重新加载Nginx服务:
sudo systemctl reload nginx
如果你想禁用Nginx服务在启动时启动:
sudo systemctl disable nginx
并重新启用它:
sudo systemctl enable nginx
也可以使用service管理Nginx服务
停止Nginx服务,请运行:
sudo service nginx stop
要再次启动,请键入:
sudo service nginx start
重新启动Nginx服务:
sudo service nginx restart
在进行一些配置更改后重新加载Nginx服务:
sudo service nginx reload

11.安装java环境[11]

jenkins需要java环境,所以要先安装java
apt install openjdk-8-jre-headless
安装完成后测试是否安装成功
java -version
如果你看到类似下面的返回,说明安装成功了

openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

12.安装jenkins [12]

参考

  • 安装
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
  • 升级
//Once installed like this, you can update to the later version of Jenkins (when it comes out) by running the following commands:
sudo apt-get update
sudo apt-get install jenkins

启动Jenkins

service jenkins start

访问Jenkins管理页面(默认端口8080)

http://<ip>:8080
  • 安装包做了如下事情
  • Jenkins will be launched as a daemon up on start. See /etc/init.d/jenkins for more details.
  • The 'jenkins' user is created to run this service.
    Log file will be placed in /var/log/jenkins/jenkins.log. Check this file if you are troubleshooting Jenkins.
  • /etc/default/jenkins will capture configuration parameters for the launch like e.g JENKINS_HOME
  • By default, Jenkins listen on port 8080. Access this port with your browser to start configuration.

If your /etc/init.d/jenkins file fails to start jenkins, edit the /etc/default/jenkins to replace the line
HTTP_PORT=8080byHTTP_PORT=8081
Here, 8081 was chosen but you can put another port available.

完成之后,打开ip:8081即可看到jenkins

第一次打开会要求输入密码
可用cat /var/lib/jenkins/secrets/initialAdminPassword查看并复制密码

一般选择推荐即可。
开启jenkins之旅吧。

  • 遇到的问题总结:
  1. 按照windows的配置方式配置好之后,想把代码拉取到自定义的workspace目录下,在windows上正常运行,但是在ubuntu上报错了,

后来分析原因是安装时jenkins用的是自己新建的用户叫jenkinsjenkins没有足够权限,不能创建文件夹导致,后取消自定义工作空间,后正常构建。jenkins默认工作目录/var/lib/jenkins/workspace/

  1. 构建node应用程序时需要用到npm命令npm install,但是会碰到
    npm WARN checkPermissions Missing write access to /var/lib/jenkins/workspace/meeting/node_modules的权限错误问题,这是需要提升权限,顾用sudo npm install,但是此时还会出现# [sudo: no tty present and no askpass program specified”的错误,由于帐号并没有开启免密码导致的 ,解决办法就是切换到root用户并添加jenkins的权限vim /etc/sudoers添加免密码jenkins ALL = NOPASSWD: ALL,也可以将jenkins用户添加可以用sudo执行命令
  1. jenkins权限问题终极解决方案
    在Ubuntu下,当执行apt-get install方式安装Jenkins的时候,会自动创建jenkins用户,这是一个没有用户目录的账号。
    用root运行jenkins
    修改/etc/default/jenkins文件,
    NAME=jenkins替换成NAME=root即可
    如果不想让Jenkins拥有root权限也可以将jenkins账号分别加入到root组中
    gpasswd -a root jenkins
    把jenkins用户加入sudo用户组
    adduser jenkins sudo或者在/etc/sudoers 文件加入
    jenkins ALL = (ALL) ALL如下
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
jenkins ALL = (ALL) ALL

让jenkins执行sudo权限的命令,并且不需要密码,可设置/etc/sudoers 文件,加入
jenkins ALL = NOPASSWD: ALL
设置密码(也可以选择在vi sudo设置NOPASSWD让用户请求sudo权限时不需要输入密码)
passwd jenkins

然后重启服务
service jenkins restart

  • 将jenkins 8080端口映射到80端口 参考jenkins官网
    在/etc/nginx/sites-available/ 下新建名为jenkins文件,将以下内容拷贝进去
upstream jenkins {
    server 127.0.0.1:8080 fail_timeout=0;
}
server {
    listen 80;
    server_name jenkins.test.cn;
    return 301 https://$host$request_uri;
}
server {
    # listen 80;
    listen 443 ssl;
         server_name jenkins.test.cn;
    ssl_certificate  cert/jenkins/jenkins.test.cn_bundle.pem;
        ssl_certificate_key cert/jenkins/jenkins.test.cn.key;
        ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;


    
    location / {
      proxy_set_header        Host $host:$server_port;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
 
      # Fix the "It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://127.0.0.1:8080;
      proxy_read_timeout  90;
 
      proxy_redirect      http:// https://;
  
      # Required for new HTTP-based CLI
      proxy_http_version 1.1;
      proxy_request_buffering off;
      # workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
      add_header 'X-SSH-Endpoint' 'jenkins.domain.tld:50022' always;
    }
}

然后输入一下命令,在sites-enabled文件夹下建立jenkins文件的链接

ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/

最后再重启nginx即可

service nginx restart
nginx -s reload
//如果是用supervisor管理的nginx进程可以重新加载
supervisorctl restart nginx

13.ubuntu获取ssh-key[13]

一般linux服务器或git需要用户名密码登录,不过也可以使用ssh-key密钥登录,免去每次登录需要密码的麻烦.
并且jenkins在获取私有的git仓库的时候也是需要登录的,这时候用ssh-key密钥登录再方便不过了.

配置ssh-key
生成SSH密钥打开终端命令工具,输入命令:ssh-keygen -t rsa -C "自己的邮箱",
公钥内容在/root/.ssh/id_rsa
私有内容在/root/.ssh/id_rsa.pub

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #直接回车用默认值
Enter passphrase (empty for no passphrase):#直接回车不设密码
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. #private key 路径
Your public key has been saved in /root/.ssh/id_rsa.pub. #public key路径
The key fingerprint is:
SHA256:F0HjFgCmEhn6G0a7+wWGLImMWyF3cWb5VkjI/iVTys 自己的邮箱
The key's randomart image is:
+---[RSA 2048]----+
|  oo. *o.+=  .   |
| ... B  o..+* +  |
|o = o    o+= B o |
|+B *     .o.E o  |
|=.O o   S .  .   |
| = = .   .       |
|. o   .          |
|   . .           |
|  ...            |
+----[SHA256]-----+

使用命令: cat /root/.ssh/id_rsa可查看到

14.安装node.js[14]

sudo apt-get update
sudo apt-get install nodejs npm
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
sudo npm install n -g
sudo n stable

淘宝镜像https://npm.taobao.org/

n是一个Node工具包,它提供了几个升级命令参数:

n                              显示已安装的Node版本
n latest                       安装最新版本Node
n stable                       安装最新稳定版Node
n lts                          安装最新长期维护版(lts)Node
n <version>                    根据提供的版本号安装Node

安装后,切换版本:

sudo n           方向键选择已安装的 node 版本,然后回车确认
node -v          检查当期版本

15.ubuntu数据盘挂载和卸载[15]

在阿里云买了一个数据盘,如果要使用这个数据盘,首先我们得先进行数据盘的挂载。

  • 检查服务器数据盘情况
    运行fdisk -l命令,检查当前VPS的数据硬盘情况
root@VM-16-14-ubuntu ~# fdisk -l
Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3fa1d255

Device     Boot Start       End   Sectors  Size Id Type
/dev/vda1  *     2048 209715166 209713119  100G 83 Linux  #此处就是需要挂载的云硬盘


Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

里我们可以看到有100GB的数据盘没有挂载,这就是我们买的数据盘。

  • 进行分区
    运行fdisk /dev/vdb,对应的命令在命令行中已注释
root@VM-16-14-ubuntu ~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G  4.0K  7.8G   1% /dev
tmpfs           1.6G  6.1M  1.6G   1% /run
/dev/vda1        99G  2.8G   92G   3% /
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/0
root@VM-16-14-ubuntu ~# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x0b0ac170.

Command (m for help): n #输入 n, 新建一个新分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p #出现两个菜单e表示扩展分区,p表示主分区,这里输入 p
Partition number (1-4, default 1): 1 #输入1表示第一个主分区
First sector (2048-209715199, default 2048): 
#直接按回车表示1柱面开始分区
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199):
#直接回车,表示剩余空间分给此主分区, 此处我选择了直接回车
#输入+5620M 按回车,表示此分区为5G空间

Created a new partition 1 of type 'Linux' and of size 100 GiB.

Command (m for help): p #输入p查看一下分区
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0b0ac170

Device     Boot Start       End   Sectors  Size Id Type
/dev/vdb1        2048 209715199 209713152  100G 83 Linux

Command (m for help): w #输入w保存退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

完毕之后,我们输入fdisk -l查看分区情况

root@VM-16-14-ubuntu ~# fdisk -l
Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3fa1d255

Device     Boot Start       End   Sectors  Size Id Type
/dev/vda1  *     2048 209715166 209713119  100G 83 Linux


Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0b0ac170

Device     Boot Start       End   Sectors  Size Id Type
/dev/vdb1        2048 209715199 209713152  100G 83 Linux

正常是可以看到100GB已经完成分区为/dev/vdb1

  • 格式化分区及挂载目录
    格式化挂载数据硬盘分区,输入mkfs.ext3 /dev/vdb1
root@VM-16-14-ubuntu ~# mkfs.ext3 /dev/vdb1
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
Filesystem UUID: 4e9228a0-1ec1-4906-8bfb-be6fe8fe40ae
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

创建目录挂载
我们要挂载/data目录下,原始目录没有此文件夹,我们先创建mkdir /data
挂载/dev/vdb1,命令 mount /dev/vdb1 /data
查看分区,输入df -h

root@VM-16-14-ubuntu ~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G  4.0K  7.8G   1% /dev
tmpfs           1.6G  6.1M  1.6G   1% /run
/dev/vda1        99G  2.8G   92G   3% /
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/0
/dev/vdb1        98G   61M   93G   1% /data

我们可以看到/dev/vdb1挂载到/data目录下了
但是仅仅这样还不够,当重启这个节点之后,新分配的空间又没有挂载上去。所以,需要设置下,让其每次开机自动挂载。
执行命令:

echo '/dev/vdb1  /data ext3    defaults    0  0' >> /etc/fstab

此刻,挂载完成。

  • 数据盘的卸载
    输入 umount /dev/vdb1
    如果提示设备忙,无法挂载输入:
fuser -km /dev/vdb1
umount /dev/vdb1

再删除/etc/fstab文件中,如下的数据
/dev/vdb1 /data ext3 defaults 0 0
此刻,卸载完成。
附上分区工具fdisk命令参数介绍
p、打印分区表。
n、新建一个新分区。
d、删除一个分区。
q、退出不保存。
w、把分区写进分区表,保存并退出。

16.mysql移动存放目录 [16]

TODO:目前仍未实现,实践成功后补上

参考

17.安装.netcore sdk/asp.netcore/.net core环境 [17]

参考官网

  • 注册 Microsoft 密钥和源
    安装 .NET 之前,需要:注册 Microsoft 密钥,注册产品存储库,安装必需的依赖项,每台计算机只需要执行一次此操作。
    wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb

  • 安装 .NET Core SDK
    更新可供安装的产品,然后安装 .NET Core SDK

sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-3.1
  • 安装 ASP.NET Core 运行时
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install aspnetcore-runtime-3.1
  • 安装 .NET Core 运行时
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-runtime-3.1

18.使用 Nginx 在 Linux 上托管 ASP.NET Core[18]

参考官网
部署步骤:

  1. 将现有 ASP.NET Core 应用置于反向代理服务器后方。
  2. 设置反向代理服务器,以便将请求转发到 Kestrel Web 服务器。
  3. 确保 Web 应用在启动时作为守护程序运行。
  4. 配置进程管理工具以帮助重新启动 Web 应用。

在开发环境中运行 dotnet publish,将应用打包到可在服务器上运行的目录中

dotnet publish --configuration Release

如果不希望维护服务器上的 .NET Core 运行时,还可将应用发布为独立部署

如果使用vs发布则需要配置发布选择目标框架,部署模式可选择框架依赖,目标运行时选择linus-x64, 发布成功后将发布文件拷贝到ubuntu服务器上
测试应用:
1.在命令行中运行应用:dotnet <app_assembly>.dll。
2.在浏览器中,导航到 http://<serveraddress>:<port> 以确认应用在 Linux 本地正常运行。(此步骤需要提前开放对应端口,但是一般没有开放,后续需要用nginx配置代理,所以上一步运行没报错就可认为成功了)

  • 配置反向代理服务器
    可在/etc/nginx/sites-available/default配置文件中写入如下配置:
    注意:server和server是并列关系,即可知道此处配置放的位置
server {
  listen 8001; # 部署的监听端口
  server_name test_api; # server_name
  location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # try_files $uri $uri/ =404;

        proxy_pass         http://localhost:5000; # 部署的服务器api地址
            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;
    }
}

完成配置 Nginx 后,运行 sudo nginx -t 来验证配置文件的语法。 如果配置文件测试成功,可以通过运行 sudo nginx -s reload 强制 Nginx 执行更改
测试应用:要直接在服务器上运行应用
1.请导航到应用目录。
2.运行应用:dotnet <app_assembly.dll>,其中 app_assembly.dll 是应用的程序集文件名。
如果应用在服务器上运行,但无法通过 Internet 响应,请检查服务器的防火墙,并确认端口 8001已打开.
但是此时控制台退出则服务就中断,需要配置systemd服务监视启动该服务

  • 监视应用
    服务器设置为将对 http://<serveraddress>:8000 发起的请求转接到在 http://127.0.0.1:5000 中的 Kestrel 上运行的 ASP.NET Core 应用。 但是,未将 Nginx 设置为管理 Kestrel 进程。 systemd 可用于创建服务文件以启动和监视基础 Web 应用。 systemd 是一个init system,可以提供用于启动、停止和管理进程的许多强大的功能
    /etc/systemd/system 下新建文件(推荐使用winscp),文件名以.service结尾,配置内容为,
    或者使用命令行创建该文件:
sudo nano /etc/systemd/system/kestrel-helloapp.service

以下是应用的一个示例服务文件:

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/data/web/test/api/test_ubuntu #工作目录,填你应用的绝对路径
#启动:前半截是你dotnet的位置(一般都在这个位置),后半部分是你程序入口的dll,中间用空格隔开
ExecStart=/usr/bin/dotnet /data/web/test/api/test_ubuntu/test.Api.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10 #如果服务出现问题会在10秒后重启,数值可自己设置
KillSignal=SIGINT
SyslogIdentifier=test_web #设置日志标识,此行可以没有
User=root # 配置服务用户,此处可用其他用户,但是必须先创建此处定义的用户,并为该用户提供适当的文件所有权
Environment=ASPNETCORE_ENVIRONMENT=Production
# Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

Linux 具有区分大小写的文件系统,所以文件路径及配置路径需要区分大小写
保存该文件并启用该服务

sudo systemctl enable kestrel-helloapp.service

启用该服务,并确认它正在运行

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

● kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
    Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

在外界访问域名+端口,成功访问到在5000端口运行的程序
至此在使用Nginx进行反向代理成功
后期如果更改了程序内容需要重启对应服务

systemctl daemon-reload #如果文件修改了需要重新载入
systemctl restart test-app.service #重启对应的service
  • 查看日志
    使用 Kestrel 的 Web 应用是通过 systemd 进行管理的,因此所有事件和进程都被记录到集中日志。 但是,此日志包含由 systemd 管理的所有服务和进程的全部条目。 若要查看特定于 kestrel-helloapp.service 的项,请使用以下命令
sudo journalctl -fu kestrel-helloapp.service

有关进一步筛选,使用时间选项(如 --since today、--until 1 hour ago)或这些选项的组合可以减少返回的条目数

sudo journalctl -fu kestrel-helloapp.service --since "2020-01-01" --until "2020-01-08 00:00"

19. docker安装mongodb

mongodb 官网:https://www.mongodb.com/

  1. 查看mongodb
    docker hub中mongo版本https://hub.docker.com/_/mongo?tab=tags&page=1
    也可在docker cli中查看:docker search mongo
$ docker search mongo
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mongo                               MongoDB document databases provide high avai…   6622                [OK]
mongo-express                       Web-based MongoDB admin interface, written w…   634                 [OK]
  1. 安装最新版mongo
$ docker pull mongo:latest
  1. 查看本地镜像
$ docker images
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
mongo                                              latest              bcef5fd2979d        10 days ago         386MB
  1. 运行容器,两种方式,一种不加auth,一种加auth

a. 不加auth验证

$ docker run -itd --name mongo -p 27017:27017 mongo

b. 加auth验证

$ docker run -itd --name mongo -p 27017:27017 mongo --auth

--auth:需要密码才能访问容器服务。

  1. 查看容器
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
1a0c1679fffa        mongo               "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       0.0.0.0:27017->27017/tcp   mongo
  1. 使用auth验证(即步骤4中b方式),需添加用户
$ docker exec -it mongo mongo admin
# 创建一个名未admin,密码为123456的用户
> db.createUser({user:'admin',pwd:'123456',roles:[{role:'userAdminAnyDatabase',db:'admin'}]});
# 尝试使用上面创建的用户信息进行连接
> db.auth('admin','123456');
1 #返回1说明登录成功
  1. 使用客户端连接mongoDb
    此处选择mongo官方自己的客户端Compass
    下载地址:https://www.mongodb.com/download-center/compass
    安装完成后,连接服务, 连接字符串说明:https://docs.mongodb.com/manual/reference/connection-string/
    标准格式:mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[database][?options]]

其他

权限设置问题:
chown -R jenkins /data/source

jenkins发布vue项目

jenkins发布webapi项目

目录:(简书中用脚注实现的)


  1. 1.windows下使用putty工具

  2. windows下使用WinSCP作为文件可视化工具

  3. 创建root,并使用root登录

  4. 安装fish

  5. 安装docker

  6. docker配置nginx

  7. 安装mysql

  8. 监控mysql正在执行的sql和日志

  9. 安装redis

  10. 安装和配置nginx

  11. 安装java环境

  12. 安装jenkins

  13. ubuntu获取ssh-key

  14. 安装node.js

  15. ubuntu数据盘挂载和卸载

  16. mysql移动存放目录

  17. 安装.netcore sdk/asp.netcore/.net core环境

  18. 使用 Nginx 在 Linux 上托管 ASP.NET Core

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,504评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,898评论 1 300
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,218评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,322评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,693评论 3 290
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,812评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,747评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,476评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,700评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,190评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,541评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,206评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,129评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,903评论 0 199
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,894评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,748评论 2 274

推荐阅读更多精彩内容