리눅스

 

 

스프링부트 의 경우  다음 빌드 처리 다음 참조

스프링부트 War 파일 배포시 404 에러

https://macaronics.net/index.php/m01/spring/view/1759

 

 

셀 스크립트 참조

https://macaronics.net/index.php/m01/spring/view/1582

 

 

nohup을 이용하여 무중단 서비스 만들기

 

 

 

 

1 .Ubuntu 20.04 LTS 다운로드 및 설치하기

https://ubuntu.com/download/desktop

 

https://blog.dalso.org/linux/ubuntu-20-04-lts/8850

 

 

 

 

2. 우분투 업데이트 및 ssh 설치

 

1) 패키지 정보 업데이트

update - 설치 가능한 패키지 리스트를 최신화
upgrade - 실제 업데이트

$ sudo apt update

$ sudo apt upgrade

 

2) ssh server 설치

$ sudo apt install openssh-server

 

3)ssh 서버 시작
sudo  systemctl enable sshd
sudo  systemctl restart sshd

 

4) 기타 

환경에 맞게 설정을 편집합니다. 자세한 내용은 SSH 보안 설정 

$ sudo vi /etc/ssh/sshd_config

 

 

 

ssh 를 22번이 아닌 다른 포트 사용

=>

https://www.lesstif.com/lpt/ssh-22-20776114.html

 

 

 

 

 

 

 

3-1. JDK 11 설치

 

다음 명령 어로 깔끔하게 설치 된다.

 

  • 다음과 같이 openjdk-11-jdk를 설치
$ sudo apt-get install openjdk-11-jdk
  • 설치가 완료되면 다음과 같이 설치가 되었는지 확인

  • $ java -version

 

 

 

 

3-2. 자바 1.8 설치

1)  openjdk 설치
$ sudo apt-get install openjdk-8-jdk

 

2)설치 확인

$ java -version

 

3) 환경별수 설정

a) 위치확인

$ which javac

 

b)링크 설정

$readlink -f /usr/bin/javac

 

 

JAVA_HOME은 /usr/lib/jvm/java-8-openjdk-amd64으로 설정

 

c) 새로 vi에디터를 설치

$sudo apt-get install vim

 

 

d)설치후 vi 로 profile 수정

$ vi /etc/profile
 

 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  export PATH=$JAVA_HOME/bin:$PATH
  export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

 

 

e) profile reload

$source /etc/profile

 

f)환경변수 확인

$echo $JAVA_HOME
 

# $JAVA_HOME/bin/javac -version



 

 

 

4. MariaDB 설치하기

참조 할것

https://blogger.pe.kr/885

 

1)MariaDB 서버를 설치

$ apt install mariadb-server 

 

2) mariadb-client를 설치

$ apt-get install mariadb-client 

$ mysql_secure_installation

 

접속테스트를 해보자. mysql -u root -p 명령을 root 권한으로 실행

$ mysql -u root  -p

 

 

 

3)원격접속 허용

vi /etc/mysql/mariadb.conf.d/50-server.cnf

에서

 bind-address = 127.0.0.1을 주석 처리

 

 

대소문자 구분 제거

 

[mysqld] 밑에

lower_case_table_names=1

 

포트변경

[mysqld] 밑에

port = 33066

 

 

 

 

 

 

 

 

유저생성  및 디렉토리 권한 부여

 

1) addUser  [계정 이름]

 

 

업로드 디렉토리 생성

# mkdir uploads

 

chmod -R 755 ./[파일 또는 디렉토리] 

 

#chmod -R 755 uploads/

 

 

 

 

 

 

 

 

 

 

 

5.톰캣 설치

 

1)톰캣을 설치할 임의 위치로 이동 

$ cd home/ubuntu 

 

2) 다음 원하는 톰캣 버전을  wget 을 통해 다운로드 한다.

https://tomcat.apache.org/download-80.cgi

 

(wget 설치 안되었을 경우 $apt install wget )

오른쪽 마우스로 링크주소 복사후 설치

 

wget  https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz


 

 

3)압축 풀기

$ tar -zxvf  apache-tomcat-8.5.73.tar.gz 

$ mv apache-tomcat-8.5.73 www

 

 

4) 톰캣 구동및 확인

root@ubuntu:/home/ubuntu# /home/ubuntu/www/bin/startup.sh

$ ifocnfig 로 로컬 아이피 확인후

 

클라우드 호스팅 및 기타 서버에서

톰캣 화면이 뜨지 않을 경우 톰캣 server.xml(/home/ubuntu/www/conf/server.xml )

  방화벽 8080 포트 번호를 오픈 시켜준다.

 

 netstat -an | grep 8080 확인 및 브라우저 확인

 

 

 

캐시오류 시 설정

 

conf/context.xml

    
    
    WEB-INF/web.xml
    WEB-INF/tomcat-web.xml
    ${catalina.base}/conf/web.xml
    
    
    

 

 

 

 

 tomcat server.xml 수정

 

- tomcat에서는 실제 작업을 하지 않아도 연동은 된다. 다만, 클라이언트 접속 로그 기록이 기본 적으로 nginx의 호스트 ip가 기록이 됨으로 실제 접속 클라이언트 IP가 기록되도록 이부분을 변경을 해 주도록 하자.

%h 를 %{x-forwarded-for}i  변경, x-forwarded-for로 넘겨진 인자를 access_log 파일에 기록

변경전

 

<Valve className=org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

 

 

변경후

		<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
		    prefix="localhost_access_log" suffix=".txt"
		   pattern="%{X-Forwarded-For}i %l %u %t &quot;%r&quot; %s %b" />

 

**  X-Real-IP 헤더를 사용한다면 %{x-real-ip}i 를 사용하면 된다.

 

 

=> 

Load Balancer 바깥 클라이언트의 IP 알아내고 Access Log 남기기

 

 

 

 

 

 

 

 

 

6. nginx 설치

 

1)  Nginx 설치

$ sudo apt install nginx

 

2) 실행 (부팅시 자동 실행)
$ sudo systemctl start nginx

$ sudo systemctl enable nginx
$ sudo systemctl status nginx

 

3)브라우저 화면으로 확인 80포트

 

추가참조:

https://t-okk.tistory.com/154

 

 

 

6. nginx 톰캣 연동

만약 아파치가 이미 설치되어 있는 상태라면, 깨끗히 아파치를 지우고 시작하자. 왜냐하면 nginx와 apache 둘 다 80 포트를 사용하는 웹 서버이기 때문에 충돌이 일어난다.

 

1) 백업

혹시, 설정이 안될 경우 대비하여 default  파일을 임의 디렉토리 cp  또는  다운로드 백업

/etc/nginx/sites-available/default 

 

2) default 설정 파일을 연다음

$ sudo vi  /etc/nginx/sites-available/default

 

전부 지우고 다음을 입력

upstream tomcat {
        ip_hash;
        server 127.0.0.1:8080;
} 


server {
        server_name  도메인주소 www.도메인주소;
 
        location / {
            proxy_set_header    Host $http_host;
            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;
            proxy_set_header    X-NginX-Proxy true;
 
            proxy_pass http://tomcat;
            proxy_redirect      off;
            charset utf-8;
         }



}

 

 

nginx의 기본 업로드 제한이 1MB이기 때문에 발생하는 문제이다. 해당 사이즈를 원하는 크기로 변경하면 정상적으로 파일이 업로드가 된다.

 

우선 설정을 위해 nginx.conf 파일을 열어야한다.

 

vi /etc/nginx/nginx.conf

 

우분투 기준으로 /etc/nginx 디렉토리에 nginx.conf 파일이 위치한다. vi로 해당 파일을 열기위해 위에 작성한 명령어를 입력한다.

해당 파일을 열면 위와 같은 화면이 보이는데 그 중 http 블록안에 client_max_body_size 항목을 추가할 수 있다.

현재 client_max_body_size 10M; 이라고 작성했는데 이는 업로드 제한 용량을 10M로 설정한 것이다

 

 

 

3) nginx 재시작

$ systemctl restart nginx

 

 

 

★두개포트 설정  -  백엔드 리액트 설정시

톰캣 설정한것 처럼 복사해서  아래로 리액트로 붙여서  포트와 도메인만 변경해주면 된다.

 

upstream tomcat {
        ip_hash;
        server 127.0.0.1:5000;
}
server {
        server_name  도메인주소 www.도메인주소;

        location / {
            proxy_set_header    Host $http_host;
            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;
            proxy_set_header    X-NginX-Proxy true;

            proxy_pass http://tomcat;
            proxy_redirect      off;
            charset utf-8;
         }
}


#################### 프론트  ################
upstream react {
        ip_hash;
        server 127.0.0.1:3000;
}
server {
        server_name  도메인주소 www.도메인주소;

        location / {
            proxy_set_header    Host $http_host;
            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;
            proxy_set_header    X-NginX-Proxy true;

            proxy_pass http://react;
            proxy_redirect      off;
            charset utf-8;
         }
}

 

 

 

cors 설정  예 ===>

 

upstream tomcat {
        ip_hash;
        server 127.0.0.1:5000;
} 
 
 
server {

#    listen 80;
#    listen [::]:80;	

    server_name  ma7server.p-e.kr www.ma7server.p-e.kr;

        location ~* \.(eot|ttf|woff|woff2)$ {
		    add_header Access-Control-Allow-Origin *;
        }

		location / {
	 	    proxy_set_header    Host $http_host;
	        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;
	        proxy_set_header    X-NginX-Proxy true;
	        proxy_pass http://tomcat;
		    proxy_redirect      off;
	        charset utf-8;      
		}


	    location /todo {
	         	proxy_hide_header Access-Control-Allow-Origin;
			    add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
			    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
		        add_header 'Access-Control-Allow-Credentials' 'true';
		        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
		        add_header 'Access-Control-Max-Age' 1728000;
		        proxy_pass  http://tomcat ;
		        proxy_redirect      off;
				charset utf-8;       
		  }
	
		location /api {
	 			proxy_hide_header Access-Control-Allow-Origin;
			    add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
			    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
		        add_header 'Access-Control-Allow-Credentials' 'true';
		        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
		        add_header 'Access-Control-Max-Age' 1728000;
		        proxy_pass  http://tomcat ;
		        proxy_redirect      off;
				charset utf-8;        
		}




    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ma7server.p-e.kr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ma7server.p-e.kr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

 
server {
    if ($host = ma7server.p-e.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  ma7server.p-e.kr www.ma7server.p-e.kr;
    listen 80;

    return 404; # managed by Certbot
}





######################## front 설정 ###################

upstream react {
        ip_hash;
        server 127.0.0.1:3000;
} 
 
 
server {

        server_name   ma7front.p-e.kr  www.ma7front.p-e.kr;
  
        location / {
            proxy_set_header    Host $http_host;
            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;
            proxy_set_header    X-NginX-Proxy true;
  
            proxy_pass http://react;
            proxy_redirect      off;
            charset utf-8;
         }
 
     listen [::]:443 ssl ipv6only=on; # managed by Certbot
     listen 443 ssl; # managed by Certbot
     ssl_certificate /etc/letsencrypt/live/ma7front.p-e.kr/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/ma7front.p-e.kr/privkey.pem; # managed by Certbot
     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}





server {
    if ($host = ma7front.p-e.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  ma7front.p-e.kr www.ma7front.p-e.kr;
    listen 80;
    return 404; # managed by Certbot

}

 

 

 

리액트는   빌드를 통해 3000 포트로 돌리면서 로그를 확인 할수 있다.

serve -s build

https://soonysoon.tistory.com/88

 

 

최종 적으로 완성 된 코드는

 

1) 리액트를 빌드 한다. 

$npm run build 한다.

여기서는 home/react/jpaApp/build 경로로 빌드 파일이 생성 되었다.

 

2)  nginx   기본 루트 경로는  /usr/share/nginx/html; 인데 이 경로를  리액트 build  경로로 변경

다음과 같이 root 경로를 리액트 빌드 파일 경로로 변경 처리 한다  . root /home/react/jpaApp/build;

server {

        server_name   ma7front.p-e.kr  www.ma7front.p-e.kr;
  
	    listen 80;
    	listen [::]:80;
        
        location / {
			 root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로
			index  index.html index.htm;
			try_files $uri /index.html;
         }
 


}

 

ngix 를 재구동 한다.

$systemctl restart nginx 

 

3)리액트 디렉토리 nginx 유저 권한으로 변경 시키기

만약에 500 에러가 나거나 권한 설정 에러 403에러가 나오면

nginx.conf  파일을 열고 

$ vim /etc/nginx/nginx.conf

맨 상단의 user 권한을 확인한다

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

~

현재 유저 권한이 www-data 로 나와 있는데

react 디렉토리를 다음과 같이 nginx 유저 권한으로 변경 시킨다.

 

$chown -R www-data:www-data  /home/react/ 

===>

또는 react  서버 배포   유저로 명으로 변경후 nginx  재실행한다.

user nginx;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

~

$ systemctl restart nginx

 

 

upstream tomcat {
        ip_hash;
        server 127.0.0.1:5000;
} 
  
server {

      server_name  ma7server.p-e.kr www.ma7server.p-e.kr;


	## 다음 woff2 파일들이 차단될 경우 설정
        location ~* \.(eot|ttf|woff|woff2)$ {
		    add_header Access-Control-Allow-Origin *;
        }
	######################## 일반 웹 설정 ###################	
	location / {
	 	proxy_set_header    Host $http_host;
	        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;
	        proxy_set_header    X-NginX-Proxy true;
	        proxy_pass http://tomcat;
		proxy_redirect      off;
	        charset utf-8;      
	}




	######################## /todo 시작되는 경로와  /api 로 시작되는 경로는 restapi jwt 설정 ###################

	location /todo {
	      	proxy_hide_header Access-Control-Allow-Origin;
	        add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
	        add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
	        add_header 'Access-Control-Allow-Credentials' 'true';
	        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
	        add_header 'Access-Control-Max-Age' 1728000;
	        proxy_pass  http://tomcat ;
	        proxy_redirect      off;
				charset utf-8;       
	 }
	
	location /api {
	       proxy_hide_header Access-Control-Allow-Origin;
	       add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
	       add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
	       add_header 'Access-Control-Allow-Credentials' 'true';
	       add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
	       add_header 'Access-Control-Max-Age' 1728000;
		proxy_pass  http://tomcat ;
		proxy_redirect      off;
		charset utf-8;        
	}

}






######################## front 설정 ###################

 
server {

        server_name   ma7front.p-e.kr  www.ma7front.p-e.kr;
  
	listen 80;
    	listen [::]:80;
        
        location / {
		 root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로
		index  index.html index.htm;
        	try_files $uri /index.html;
         }

}


 

=> ssl certbot  적용후 코드

upstream tomcat {
        ip_hash;
        server 127.0.0.1:5000;
} 
  
server {

    server_name  ma7server.p-e.kr www.ma7server.p-e.kr;

        location ~* \.(eot|ttf|woff|woff2)$ {
		    add_header Access-Control-Allow-Origin *;
        }

		location / {
	 	    proxy_set_header    Host $http_host;
	        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;
	        proxy_set_header    X-NginX-Proxy true;
	        proxy_pass http://tomcat;
		    proxy_redirect      off;
	        charset utf-8;      
		}


	    location /todo {
	         	proxy_hide_header Access-Control-Allow-Origin;
			    add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
			    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
		        add_header 'Access-Control-Allow-Credentials' 'true';
		        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
		        add_header 'Access-Control-Max-Age' 1728000;
		        proxy_pass  http://tomcat ;
		        proxy_redirect      off;
				charset utf-8;       
		  }
	
		location /api {
	 			proxy_hide_header Access-Control-Allow-Origin;
			    add_header 'Access-Control-Allow-Origin' '*' always;   #모든 도메인 허용할경우
			    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
		        add_header 'Access-Control-Allow-Credentials' 'true';
		        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always;
		        add_header 'Access-Control-Max-Age' 1728000;
		        proxy_pass  http://tomcat ;
		        proxy_redirect      off;
				charset utf-8;        
		}




    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ma7server.p-e.kr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ma7server.p-e.kr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

 
server {
    if ($host = ma7server.p-e.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  ma7server.p-e.kr www.ma7server.p-e.kr;
    listen 80;

    return 404; # managed by Certbot
}





######################## front 설정 ###################


 
server {

        server_name   ma7front.p-e.kr  www.ma7front.p-e.kr;
  
	    listen 80;
    	listen [::]:80;
        
        location / {
			 root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로
			index  index.html index.htm;
			try_files $uri /index.html;
         }
 
     listen [::]:443 ssl ipv6only=on; # managed by Certbot
     listen 443 ssl; # managed by Certbot
     ssl_certificate /etc/letsencrypt/live/ma7front.p-e.kr/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/ma7front.p-e.kr/privkey.pem; # managed by Certbot
     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}




server {
    if ($host = ma7front.p-e.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  ma7front.p-e.kr www.ma7front.p-e.kr;
    listen 80;
    return 404; # managed by Certbot

}

 

 

 

 

 

 

 

 

 

 

 

 

7.스프링 부트 배포시 오류

 

1) ServletInitializer 자바파일 추가

 

 

MacaronicsApplication.class 는

@SpringBootApplication이 설정되어 있는 클래스 파일

@EnableScheduling
@EnableAspectJAutoProxy
@Log4j
public class MacaronicsApplication

 

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(MacaronicsApplication.class);
	}

}

 

 



2) 스프링 부트 버전에 따른 이클립스 자바 컴파일 문제 

 

window -> Preferences->java

 

 

 

3)기타 다음을 참조

 

★스프링부트 War 파일 배포시 404 에러

http://macaronics.net/index.php/m01/spring/view/1759

 

 

 

 

 

 

 

 

 

 

8. SSL certbot  

다음 사이트에서 운영체제 서버환경등 플랫폼에 맞게 메뉴얼에 맞게 설치하면 된다.

https://certbot.eff.org/

 

 

 

Node.js HTTPS 설정하기

https://freestrokes.tistory.com/154#hELLO

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

글 못한 놈 붓 고른다 , 학식이나 기술이 모자라는 사람일수록 공연한 트집을 잘 잡는다는 말.

댓글 ( 11)

댓글 남기기

작성
  •    
  •    
  •  

리눅스 목록    more