## 买服务器
首先先买个服务器,什么云自己选择,我买的是阿里云。经过我几天的体验,感觉阿里云里,按量付费的服务器是比较亏的,只要我时不时点开看几下,几乎每个小时都会扣0.25元,这样算下来比包年肯定是贵的,我配置两天就花了十几块。所以不如包年好。服务器的选择上,1g内存就不要考虑了,我配置好以后后台常驻1g多内存,所以直接考虑2g或者更高的就行了。一般根据情况,2g内存里比较便宜的就够用了,根据需求来。不过后来我计划转战腾讯云了,因为感觉腾讯云明显便宜而且不麻烦,阿里云太麻烦了,又得考试又得写心得,关键是不直白,我找了半天学生优惠还是一脸懵逼,腾讯云比较直白,一年100,能买4年。阿里云的优点是控制台做的比较好,有可视化界面,用户提示也好,但是这些其实都是无关紧要的东西。阿里云还有个比较坑的地方在于他竟然没有开80端口,这点对很多不太熟悉阿里云的用户很不友好,腾讯云就默认开了。
<hr>
::: hljs-center
<img src="http://47.113.201.101:8081/upload/img/20211116/af49b6b9-b354-4653-8f7b-548abf98abdc_Screenshot2021-11-16at10.35.35AM.png" width = "270" height = "100" alt="图片名称"/>
![Screenshot 20211116 at 10.39.58 AM.png](http://47.113.201.101:8081/upload/img/20211116/9b771764-a235-48ad-aba8-46f63bb75692_Screenshot2021-11-16at10.39.58AM.png)
我买的这个
:::
<hr>
反正我感觉基本没什么选择,阿里云想买最低配只能买这个。
## Nginx
Nginx的文件目录这样编排:
<img src="http://47.113.201.101:8081/upload/img/20211116/febd98b9-f650-4186-af41-b570904a991b_Screenshot2021-11-16at10.43.12AM.png" width = "180" height = "300" alt="图片名称"/>
先把前端用:
```
npm run bulid
```
进行打包,打完包以后把dist文件夹压缩,发送到root/nginx/html下,mac在终端一顿操作:
```
scp -P 22 ./dist.zip root@x.x.x.x:/root/nginx/html
```
然后输服务器进入终端的密码,输完密码就可以发送过去了。
到了服务器以后解压,弄成图片里这样就好了。
.conf文件:
```
#user root
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html last;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
```
让Nginx监听80端口,因为http协议默认就是这个端口。这里是把前端交给了Nginx进行管理,同时Nginx被Docker管理。Docker类似于一个虚拟机,有他自己的一套文件系统,/usr/share/nginx/html就是Docker虚拟机里的目录,要挂载(映射)到宿主机(即服务器)的相应路径,就是/root/nginx/html。
## Docker
目录结构:
<img src="http://47.113.201.101:8081/upload/img/20211116/8141cd46-db6f-4aeb-8288-27f03f70c15f_Screenshot2021-11-16at10.53.36AM.png" width = "180" height = "300" alt="图片名称"/>
docker-compose:
```yml
version: '3'
services:
nginx: # 服务名称
image: nginx:latest
ports:
- 80:80
volumes:
- /root/nginx/html:/usr/share/nginx/html
- /root/nginx/nginx.conf:/etc/nginx/nginx.conf
privileged: true #解决nginx文件调用的权限
mysql:
image: mysql:latest
#ports:
#- 3306:3306 不需要暴露mysql的端口
environment:
- MYSQL_ROOT_PASSWORD=xxx
- TZ=Asia/Shanghai
redis:
image: redis:latest
command: redis-server --requirepass xxx
vueblog:
image: vueblog:latest
build: .
volumes:
- /usr/local/vueblogresources/img:/usr/local/vueblogresources/img
ports:
- 8081:8081
depends_on:
- mysql
- redis
```
Dockerfile:
```
FROM openjdk:11.0.13
EXPOSE 8081
ADD vueblog-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-jar", "/app.jar"]
```
对于文件上传,注意在这里,要把vueblog项目挂载到宿主机里,否则上传的文件会上传到虚拟机里,功能不影响,但你会找不到图片在哪里,就没法统一管理静态资源了。
## 启动
把这些文件配置好以后,下载Docker和docker-compose。注意docker-compose版本不要太高,否则会出问题,参见<https://*.com/questions/67010408/unable-to-start-docker-container-from-docker-compose-unknown-flag-iidfile>。
下载完以后,启动Docker,再运行:
```
docker-compose up -d
```
会自动去Docker仓库拉取镜像。Docker里的镜像类似于java中的类的概念,而容器类似于对象的概念。最好不要提前下载java,mysql之类的东西,而是交给docker统一管理。
因为我用的是jdk11和mysql8,所以版本和老师项目是有所区别的。mysql需要设置:
```sql
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
```
去更改加密规则,否则会出问题。用mysql5.x的版本就不用改了。但是mysql8官方说速度快,所以用8还是好一些。
然后访问IP地址就可以正常显示了。记得把前后端需要改的地方都改掉,不要用localhost了。
当需要更新项目的时候,把vueblog这个**镜像**删除掉,重新构建这个镜像就好了,这样如果配置文件和代码有所更改,就能立即生效。
```
docker-compose up -d
```
## 潜在的问题
由于jre被docker管理,所以用的是格林尼治那个时间,不是东八区的时间。出现这个博客创建时间早8小时的问题,注意,不一定是数据库没设置对,而很可能是jre的问题!!!我找了一些网上的思路都没有解决这个问题。我自己采取的方法是文章写入数据库的时候手动加8小时。这个问题先搁置了。
## 总结
自此前端、后端、运维就基本都完成了。前端和上线花了我很大的功夫,都是查资料,修bug,而后端虽然Mybatis-plus我不会用,但是实现相关功能并没有花多少时间。其实仅仅后端的话,不需要把前端和运维搞到很熟悉,但是要是想自己做个东西,还是必须要会的。因为这个博客我自己要用,写一些读书笔记之类的,所以还是自己硬着头皮搭起来了。成就感当然是有的,审美也是符合了自己的预期。当然,前端上面,有很多很出色的开源项目,这个还是要一直的学习。
::: hljs-right
2021.11.16
:::