今天搞了一天的服务器,从零开始,最终将我的项目搭起来了。本文将一步步带新手走进服务器运维的道路。
wget http://aliyun-oss.linuxeye.com/oneinstack-full.tar.gz #阿里云用户下载wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz #包含源码,国内外均可下载wget http://mirrors.linuxeye.com/oneinstack.tar.gz #不包含源码,建议仅国外主机下载3. 解压 tar xzf oneinstack-full.tar.gzcd oneinstack #如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件 4.链接安装窗口 screen -S oneinstack #如果网路出现中断,可以执行命令`screen -r oneinstack`重新连接安装窗口5. 启动install.sh文件,进行安装 ./install.sh
接下来就是一大堆选项。根据自己需求安装就行了。
docker:进入我们的主题:目前流行的java服务器环境就是用docker来构建。至于docker的核心有三点:镜像,容器,仓库。
我们可以去仓库里(如阿里,网易。或Hub.docker)去下载公开的镜像。也可以通过Dockerfile来build自己的镜像。
或是构建自己私有的仓库。(这点和Git有点像)。而docker最大的特点就是:build onece can run anywhere
意味着环境隔离,运行一次后打包可在其他环境上运行,即我们只要搭好我们的环境。下次迁移时就能直接pull了。
那么就意味着我们要搭建自己的nginx.redis.mysql.springboot这四个容器。
nginx:nginx有两个特征。动静分离,负载均衡。
动静分离:要知道我们的tomcat的处理静态页面是有点吃力的。所以我们可以用nginx来实现静态分离。通过一些正则表达式来识别静态页面,然后交给nginx缓存起来。
负载均衡:我们可以在upstream中设置我们的项目对应的地址或是端口。那在我们用nginx监听我们的80端口的时候.nginx就会自动的将请求
均衡的发送给项目。其中的session是一样的。从而缓解后台的压力,提升性能。也就是所谓的集群概念。
spring boot:spring boot是目前较火的微服务架构。他的方便之处就相当与你用了idea就再也回不去eclipse一样。
redis:redis就是一种 NoSql 。nosql是一种概念。不是 no sql 而是 no only sql 可以说他是一种缓存。
当我们有一些数据有时间期限或是经常要用到的又不经常需要改动的。例如token。我们就可以把他存到redis上。
mysql:数据库就不用说了。
容器构建:
第一步:docker安装:(以centos为例)yum -y install docker即可。因为Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里了。
然后service docker start即可开启docker服务
第二步:mysql容器:mysql的容器搭建相对简单。用docker pull mysql (不指定版本会自动latest)
然后docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 -d mysql
-p:映射自己端口和容器端口
--name:设置容器名字
-eMYSQL_ROOT_PASSWORD:初始化root密码
-d 后台运行。
第三步:redis容器:redis的安装和mysql差不多 docker pull redis
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
redis-server --appendonly yes:在容器执行redis-server启动命令,并打开redis持久化配置
第四步:spring boot 。我们都知道spring boot的一个特点就是他内嵌了一个tomcat的,只要在maven中配置即可。那么我们以往的方式就是
用maven打包:mvn clean package 成一个jar包。然后在有jdk的linux下运行 nohup java -jar ***.jar & 使他在后台运行就行。
不过笔者今天运到了一个难题。就是我们在docker的环境隔离中,我们要结合spring boot ,mysql ,redis 我们要用--link的命令执行。那同时我们的
application.yml配置文件中要将mysql 的url 地址改成我们设置的别名。redis的hosts也是一样。但是用mvn clean package 打包会包连接不上redis的错误
结果找了好久才知道。我们可以用
mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true 的命令来执行只打包不运行的命令。
由于在阿里云上找不到spring boot的image。(在docker官方镜像网可以找到) 所以我们用Dockerfile的形式来build一个image
Dockerfile:
FROM java:8
VOLUME /tmp
ADD springboot-8080.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
执行:docker buit -t springboot . 用docker images 即可发现生成了一个叫springboot的镜像
启动:docker run -d -p 8080:8080 --name springboot --link mysql:mysql --link redis:redis springboot
用link连接我们的其他已启动的容器就行了。注意这里的第一个mysql,redis已启动的容器的名称。第二个是我们设置的别名
第五步:nginx:第五步就是花费了我好大时间的nginx了。下载 images 。docker pull nginx
主要的run这一步。因为我们加上自己的conf来实现我们的功能。
docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/conf.d:/etc/nginx/conf.d -v $PWD/logs:/wwwlogs --link springboot8080:springboot8080 --link springboot8000:springboot8000 -d nginx
-p 80:80:将容器的80端口映射到主机的80端口
--name mynginx:将容器命名为mynginx
-v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
-v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
我的nginx.conf配置:
user www-data; #我在linux中创建一个www的用户。但是这么做不行。启动容器时报错。于是我用root作为用户,发现可行。进入容器里面后发现其有个www-data的用户,所以我就用这个
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
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;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
}
upstream service_group{ #地址这里要填容器内的地址
server springboot8000 max_fails=1 fail_timeout=60s weight=1 ;
#server springboot2:8000 max_fails=1 fail_timeout=60s weight=1;
}
server {
listen 80;
server_name localhost;
#实际项目中的前端是独立一个nginx的,url通过子级域名来匹配的。我们后台没有什么静态页面,所以就不用设置静态分离了
# location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff)$ {
# #所有静态文件直接读取硬盘
# root /www;
# expires 30d; #缓存30天
#}
location / {
proxy_pass http://service_group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
docker 命令:
docker exec -it CONTAINER ID /bin/bash :进入容器内部
#同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
apt-get update
#安装telnet
apt-get install telnet
#安装ifconfig
apt-get install net-tools
# vim
apt-get install vim
下次发布Jenkins和java一些基础的(git,maven,token,redis)。lzd