为方便查看目录,请翻阅到文章末尾 (简书目前不支持锚点,用脚注实现类似目录)
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 用户
如果需要远程登陆:
- 创建一个 host 字段为 % 的 root 用户(创建用户的同时设置密码)
- 授权所有数据库的访问权限
- 刷新权限列表
有些 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
- nginx配置
可以参考我的文章 ubuntu上配置nginx
https://www.jianshu.com/p/c3a9569a9dbd
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=8080
byHTTP_PORT=8081
Here, 8081 was chosen but you can put another port available.
完成之后,打开ip:8081
即可看到jenkins
第一次打开会要求输入密码
可用cat /var/lib/jenkins/secrets/initialAdminPassword
查看并复制密码
一般选择推荐即可。
开启jenkins之旅吧。
- 遇到的问题总结:
- 按照windows的配置方式配置好之后,想把代码拉取到自定义的workspace目录下,在windows上正常运行,但是在ubuntu上报错了,
后来分析原因是安装时jenkins用的是自己新建的用户叫jenkins
,jenkins
没有足够权限,不能创建文件夹导致,后取消自定义工作空间,后正常构建。jenkins默认工作目录/var/lib/jenkins/workspace/
- 构建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执行命令
- 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
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]
参考官网
部署步骤:
- 将现有 ASP.NET Core 应用置于反向代理服务器后方。
- 设置反向代理服务器,以便将请求转发到 Kestrel Web 服务器。
- 确保 Web 应用在启动时作为守护程序运行。
- 配置进程管理工具以帮助重新启动 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/
- 查看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]
- 安装最新版mongo
$ docker pull mongo:latest
- 查看本地镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo latest bcef5fd2979d 10 days ago 386MB
- 运行容器,两种方式,一种不加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
:需要密码才能访问容器服务。
- 查看容器
$ 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
- 使用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说明登录成功
- 使用客户端连接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.windows下使用putty工具 ↩
-
windows下使用WinSCP作为文件可视化工具 ↩
-
创建root,并使用root登录 ↩
-
安装fish ↩
-
安装docker ↩
-
docker配置nginx ↩
-
安装mysql ↩
-
监控mysql正在执行的sql和日志 ↩
-
安装redis ↩
-
安装和配置nginx ↩
-
安装java环境 ↩
-
安装jenkins ↩
-
ubuntu获取ssh-key ↩
-
安装node.js ↩
-
ubuntu数据盘挂载和卸载 ↩
-
mysql移动存放目录 ↩
-
安装.netcore sdk/asp.netcore/.net core环境 ↩
-
使用 Nginx 在 Linux 上托管 ASP.NET Core ↩