最近给网站添加了后台,记录访问者数据的。往服务器上部署的时候很不顺利,记录一下遇到的问题及解决方案,供日后参考。
http://tomatowork.ssophie.com/
服务器在日本,访问起来不是很快…我说搞台国内云主机,老杨说,要各种备案实名,麻烦的紧…艾西…
docker ps -a能看到它exit code是137,除此之外,docker logs containerId
也看不到任何有用信息。docker inspect containerID
也看不到什么error信息。
这篇文章为exit(137)做了详细解释,十分有帮助,大概意思就是out of memory,宿主机器扛不住了就把容器kill了
https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137
运行journalctl -k | grep -i -e memory -e oom
,果然看到mysqld out of memory
了…
然后我受到启发,运行以下命令cat /proc/meminfo
查看机器内存,少的可怜,一共1G,free的只有100多。艾西。内存加到2G,再运行docker就可以了。
启动docker命令:systemctl start docker
启动docker mysql容器的命令:
docker run -p 3306:3306 --privileged=true -v /home/tomatowork/data/mysql/conf:/etc/mysql -v /home/tomatowork/data/mysql/logs:/var/log/mysql -v /home/tomatowork/data/mysql/data:/var/lib/mysql -v /home/tomatowork/data/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=hahaha -d mysql:5.7
/home/tomatowork/data/mysql/my.cnf的内容为:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
首次启动容器后,要进去mysql容器内创建database以及表,命令如下:
docker exec -it containerID /bin/bash
mysql -uroot -phahaha
create database TomatoWork;
use TomatoWork;
create table if not exists visitor_info(...);
做好操作之后,退出容器命令:
\q 会退出Mysql
exit 然后从docker exec里面退出来,回到正常terminal来
java -jar /home/tomatowork/backend/tomatowork-1-1.0.jar
运行之后,terminal不能退出,不然这个进程也就终止了。我是在自己的mac terminal里面用ssh root@服务器IP去操作的。学到了一个screen的工具,它可以做到在一个终端里面,自由切换多个命令后台,而不用担心关闭当前终端导致进程结束的问题。
首先screen -S java
新建一个screen,在里面运行java -jar /home/tomatowork/backend/tomatowork-1-1.0.jar
,然后control + A + D安然退出。
screen -ls
可以看到所有的screen。想要回到任何一个screen里面去的话,就screen -r screenID
就行了。
[root@vultr dist]# screen -ls
There are screens on:
2168.java (Detached)
1721.docker (Attached)
1688.java (Detached)
3 Sockets in /run/screen/S-root.
[root@vultr dist]# screen -r 2168
403 Forbidden
一开始没经验,谷歌胡乱搜,什么Index.html没有放在网站root文件夹下啦,网站root文件夹nginx运行用户没权限之类的,根本就不是我的情况。静下心来之后,突然想起来,nginx不是有自己的log吗,路径在nginx.conf里面有
vim /etc/nginx/nginx.conf
然后cat /var/log/nginx/error.log
error.log里面赫赫然写着index.html没权限。实际上,整个项目的root folder的权限设置都是可以的,并且nginx是用root启动的。
2020/05/08 04:39:39 [error] 700#0: *1 open() "/home/tomatowork/dist/index.html" failed (13: Permission denied), client: 124.108.22.19, server: www.tomato.ssophie.com,
最后用setenforce 0
这个命令解决了问题,网站就可以正常访问了。
nginx -t -c /etc/nginx/nginx.conf //测试配置文件
nginx -s reload //修改配置文件后重新加载
nginx //nginx启动
查看nginx进程:ps aux | grep "nginx"
查看端口号情况:netstat -anp |grep 80
nginx.conf文件内容:
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server{
listen 80 default_server;
listen [::]:80 ipv6only=on default_server;
server_name www.tomatowork.ssophie.com;
root /home/tomatowork/dist;
include /etc/nginx/default.d/*.conf;
location /api/ {
proxy_pass http://localhost:9867;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}