Java项目部署

一、安装Nginx

(一)Docker安装nginx

1.查看镜像版本

docker  search nginx

2.拉取镜像

docker pull nginx

3.查看镜像

docker images | grep nginx

4.创建挂载目录

mkdir nginx
cd nginx
mkdir conf
mkdir wwwroot
mkdir logs
#创建挂载目录
mkdir -p ./nginx/{conf,html,logs}

5.构建容器并启动

docker run -d --name=nginx -p 80:80 \
-v /local/docker/nginx/wwwroot:/usr/share/nginx/html \
-v /local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /local/docker/nginx/logs:/var/log/nginx \
nginx

(二)

1.安装依赖包

sudo yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

2.下载并解压安装包

cd /usr/local//下载tar包
sudo wget  http://nginx.org/download/nginx-1.21.4.tar.gz
sudo tar -xvf nginx-1.21.4.tar.gz

https://www.cnblogs.com/gezp/p/14967445.html

启动

# 检查配置文件
sudo /usr/local/nginx/sbin/nginx  -t
#启动
sudo /usr/local/nginx/sbin/nginx
# 重启加载配置
sudo /usr/local/nginx/sbin/nginx -s reload

配置文件

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {

	#博客服务器,多个可以实现负载均衡
    upstream sob-blog{
	   server 172.23.152.88:8082 weight=1;
    }


 
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    keepalive_timeout  65;

    #gzip  on;

   
	server {
		listen       80;
		server_name  localhost;

		#charset koi8-r;
		#access_log  /var/log/nginx/host.access.log  main;
		
		index index.html index.htm index.php;
		#用户相关的请求,转到sob-blog
		location ^~/user/ {
            	proxy_pass   http://sob-blog;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }
        
		location ^~/admin/ {
           	proxy_pass   http://sob-blog;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }
        
        location ^~/portal/ {
           	proxy_pass   http://sob-blog;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }

		#其他访问访问根目录wwwroot
		location / {
		    root   /usr/share/nginx/html;
		    index  index.html index.htm;
		    #此处解决刷新页面出现404的问题
		    try_files $uri $uri/ /index.html;
        }
		
	}
}
#user  nobody;
 
#==工作进程数,一般设置为cpu核心数
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
 
    #==最大连接数,一般设置为cpu*2048
    worker_connections  1024;
}
 
 
http {

    # 负载均衡配置
    upstream web_servers {
    server localhost:8082;
    }

    include       mime.types;
    default_type  application/octet-stream;
 
    #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  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    
    #==客户端链接超时时间
    keepalive_timeout  65;
 
    #gzip  on;
 
    #当配置多个server节点时,默认server names的缓存区大小就不够了,需要手动设置大一点
    server_names_hash_bucket_size 512;
 
    #server表示虚拟主机可以理解为一个站点,可以配置多个server节点搭建多个站点
    #每一个请求进来确定使用哪个server由server_name确定
    server {
        #站点监听端口
        listen       80;
        #站点访问域名
        server_name  localhost;
        
        #编码格式,避免url参数乱码
        charset utf-8;
 
        #access_log  logs/host.access.log  main;
 
        #location用来匹配同一域名下多个URI的访问规则
        #比如动态资源如何跳转,静态资源如何跳转等
        #location后面跟着的/代表匹配规则
        location / {
            #站点根目录,可以是相对路径,也可以使绝对路径
            root   html;
            #默认主页
            index  index.html index.htm;
            
            #转发后端站点地址,一般用于做软负载,轮询后端服务器
            #proxy_pass http://ip:端口;
 
            #拒绝请求,返回403,一般用于某些目录禁止访问
            #deny all;
            
            #允许请求
            #allow all;
            
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
            #重新定义或者添加发往后端服务器的请求头
            #给请求头中添加客户请求主机名
            proxy_set_header Host $host;
            #给请求头中添加客户端IP
            proxy_set_header X-Real-IP $remote_addr;
            #将$remote_addr变量值添加在客户端“X-Forwarded-For”请求头的后面,并以逗号分隔。 如果客户端请求未携带“X-Forwarded-For”请求头,$proxy_add_x_forwarded_for变量值将与$remote_addr变量相同  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #给请求头中添加客户端的Cookie
            proxy_set_header Cookie $http_cookie;
            #将使用代理服务器的主域名和端口号来替换。如果端口是80,可以不加。
            proxy_redirect off;
            
            #浏览器对 Cookie 有很多限制,如果 Cookie 的 Domain 部分与当前页面的 Domain 不匹配就无法写入。
            #所以如果请求 A 域名,服务器 proxy_pass 到 B 域名,然后 B 服务器输出 Domian=B 的 Cookie,
            #前端的页面依然停留在 A 域名上,于是浏览器就无法将 Cookie 写入。
            
           #不仅是域名,浏览器对 Path 也有限制。我们经常会 proxy_pass 到目标服务器的某个 Path 下,
            #不把这个 Path 暴露给浏览器。这时候如果目标服务器的 Cookie 写死了 Path 也会出现 Cookie 无法写入的问题。
            
            #设置“Set-Cookie”响应头中的domain属性的替换文本,其值可以为一个字符串、正则表达式的模式或一个引用的变量
            #转发后端服务器如果需要Cookie则需要将cookie domain也进行转换,否则前端域名与后端域名不一致cookie就会无法存取
        #配置规则:proxy_cookie_domain serverDomain(后端服务器域) nginxDomain(nginx服务器域)
            proxy_cookie_domain localhost .testcaigou800.com;
            
            #取消当前配置级别的所有proxy_cookie_domain指令
            #proxy_cookie_domain off;
            #与后端服务器建立连接的超时时间。一般不可能大于75秒;
            proxy_connect_timeout 30;
        }

        #用户相关的请求,转到sob-blog
		location ^~/user/ {
            proxy_pass   http://web_servers;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }
        
		location ^~/admin/ {
           	 proxy_pass   http://web_servers;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }
        
        location ^~/portal/ {
           	proxy_pass   http://web_servers;
			#以下是一些反向代理的配置可删除
			proxy_redirect             off; 
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header           Host $host;
			proxy_set_header 		   Cookie $http_cookie;
			proxy_set_header           X-Real-IP $remote_addr; 
			proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header           HTTP_X_FORWARDED_FOR $remote_addr;
			proxy_set_header           X-Forwarded-Server $host;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
    }

linux服务器上jar包启动及关闭方式

1、直接启动

java -jar chapter.jar

这种启动方式有个缺点:启动好了之后就不能动了,不能ctrl+c退出,也不能关闭终端,一旦退出或者关闭终端,程序就会关闭。

2.后台启动

java -jar chapter.jar &

&符号就代表后台启动,这种启动方式日志仍然输入到终端控制台中,但是ctrl+c不会关闭程序,退出终端,程序会关闭

3.nohup启动

nohup java -jar chapter.jar &

这种方式会生成一个nohup.out来记录日志,所以日志不会直接输出到终端,而且这种方式启动,ctrl+c或者关闭终端,程序都不会结束

4、指定日志文件

nohup启动的日志输出文件nohup.out是自动生成的,但是我们更希望自己指定日志输出文件,用以下命令:

nohup java -jar chapter.jar > logs.log &

此命令会将日志重定向到当前的logs.log文件中,但是只会输出标准输出。这种方式启动,ctrl+c或者关闭终端,程序都不会结束

5、重定向错误输出(推荐)

nohup java -jar chapter.jar > logs.log 2>&1 &

这条命令不懂的可以去了解一下shell脚本,我简单解释一下:
Linux下1表示标准输出,2表示错误输出
“>logs.log”表示标准输出重定向到logs.log中,默认是标准输出,省略1,不省略的话可以写成1>logs.log;
“2>&1”表示错误输出也重定向到logs.log中,其中&1表示前面的logs.log文件,不加&,写成2>1的话就表示把错误输出到1这个文件而不是前面标准输出的文件logs.log,所以&要加上;
最后一个&表示以后台方式启动程序。
这种方式启动,ctrl+c或者关闭终端,程序都不会结束。

6、以系统服务启动(更推荐)

​ 以系统服务启动,实际上就是自己注册一个系统服务,然后系统服务的功能就是启动此jar包,所以我们就可以通过启动自定义系统服务控制jar包的启动了,这种方式有很多好处,最显而易见的就是系统服务的启动、停止、查看状态、开机自启动等命令能直接管理到jar包进程。

  1. 创建自定义系统服务(只介绍CentOS7下的方式)
    在/etc/systemd/system目录下创建一个xxx.service文件,xxx就是自定义的服务名称。
    在文件中写入以下内容:
[Unit]

Description=chapter

After=syslog.target

[Service]

ExecStart=/usr/software/jdk1.8.0_221/bin/java -jar /usr/programme/serviceJarTest/chapter.jar

[Install]

WantedBy=multi-user.target

内容解释:
[Unit]说明
Description:服务的描述
After:设置在某个服务启动后启动

[Service]服务参数配置
ExecStart服务运行执行的命令

[Install]服务安装的相关设置,可设置为多用户

根据需要,自己修改description和ExecStart的内容即可(ExecStart后面的java命令需要全路径,写java -jar 会启动不了)

​ 2. 启动系统服务

systemctl start 服务名
systemctl start xxx  #启动服务
systemctl status xxx  #查看服务状态
systemctl stop xxx  #停止服务
systemctl enable xxx  #设置服务开机自启动
systemctl disable xxx  #取消服务开机自启动
systemctl restart xxx  #重启服务

7、关闭jar包程序

  • 如果是第一种方式启动,ctrl+c就可以直接关闭
  • 如果是第二种方式启动,关闭终端就可以关闭程序
  • 如果是第三四五种方式启动,可以用kill进程的方式结束进程:
    查看java进程:
ps -ef | grep java
#或者
 ps -ef|grep Blog-0.0.1-SNAPSHOT.jar
//关闭进程
#24204为查询出来的进程号
kill -s 9 24204

8.启动

nohup java -Djasypt.encryptor.password=578bee5369c35ad48751dd979ea4681e -Xms512m -Xmx512m -XX:MaxMetaspaceSize=128m  -XX:MaxNewSize=256m -jar  Blog-0.0.1-SNAPSHOT.jar  > logs.log 2>&1 &

知识点:
JDK8之后把-XX:PermSize 和-XX:MaxPermGen移除了,取而代之的是

-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)

参数介绍:
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)

您的鼓励,是我最大的动力
微信

微信

支付宝

支付宝


Java项目部署
http://www.zibbo.xyz/king/ea92c0b9.html
作者
King
发布于
2021年5月3日
许可协议