Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축
Unicorn이란?
Rails 표준 어플리케이션 서버는 무겁기 때문에, 동작이 가벼운 Unicorn 를 도입해 본다.
환경 구축
Chef-Solo + Berkshelf로 Rails 4 개발 환경 구축 참고.
다른 서버와는 다른 개인 IP를 할당합니다.
프로젝트 만들기
다음 명령을 실행합니다.
$ mkdir ~/projects/unicorn_sample
$ cd ~/projects/unicorn_sample
$ bundle init
생성된 Gemfile을 다음과 같이 재작성한다.
Gemfilesource 'https://rubygems.org'
gem 'rails', '4.2.0'
다음 명령을 실행합니다.
$ bundle install --path vendor/bundle
$ bundle exec rails new .
...
Overwrite /home/vagrant/projects/unicorn_sample/Gemfile? (enter "h" for help) [Ynaqdh] Y
...
Gemfile을 다음과 같이 다시 씁니다.
Gemfilesource 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'bcrypt', '~> 3.1.7'
gem 'unicorn'
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
end
아래 명령을 실행.
$ bundle install --path vendor/bundle
테스트용 앱 만들기
$ bundle exec rails generate scaffold board title:string text:string
$ rake db:migrate
config/routes.rb
를 아래와 같이 편집
config/routes.rbRails.application.routes.draw do
resources :boards
root “boards#index"
end
아래 명령으로 서버를 시작하고 페이지가 보이는지 확인합니다.
$ bundle exec rails server -b 0.0.0.0
Unicorn 설정
config/unicorn.rb
를 아래의 내용으로 신규로 작성 ( 참고 자료 ).
config/unicorn.rb# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true # 更新時ダウンタイム無し
listen "/tmp/unicorn.sock"
pid "/tmp/unicorn.pid"
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
아래 명령으로 unicorn 시작.
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
기동할 수 있는지 여부는 아래 명령으로 확인할 수 있습니다.
$ ps -ef | grep unicorn | grep -v grep
Unicorn을 중지하려면 다음 명령을 사용하여 프로세스를 Kill합니다.
$ kill -9 [Process ID]
이 상태로 시작 & 종료가 번거롭기 때문에 Rake task에 Unicorn 시작 & 종료 설정을 기술한다.
이 페이지 을 참고했다.
Task 템플릿 파일을 만듭니다.
$ bundle exec rails generate task unicorn
다음 내용으로 변경한다.
lib/tasks/unicorn.rakenamespace :unicorn do
##
# Tasks
##
desc "Start unicorn for development env."
task(:start) {
config = Rails.root.join('config', 'unicorn.rb')
sh "bundle exec unicorn_rails -c #{config} -E development -D"
}
desc "Stop unicorn"
task(:stop) { unicorn_signal :QUIT }
desc "Restart unicorn with USR2"
task(:restart) { unicorn_signal :USR2 }
desc "Increment number of worker processes"
task(:increment) { unicorn_signal :TTIN }
desc "Decrement number of worker processes"
task(:decrement) { unicorn_signal :TTOU }
desc "Unicorn pstree (depends on pstree command)"
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
def unicorn_signal signal
Process.kill signal, unicorn_pid
end
def unicorn_pid
begin
File.read("/tmp/unicorn.pid").to_i
rescue Errno::ENOENT
raise "Unicorn doesn't seem to be running"
end
end
end
아래의 커맨드로 Unicorn을 기동, 정지할 수 있게 된다.
$ bundle exec rake unicorn:start
$ bundle exec rake unicorn:stop
우선, Unicorn을 기동해 둔다.
Nginx 설정
다음 명령으로 설정 파일을 작성합니다.
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
/etc/nginx/conf.d/local.conf
를 다음과 같이 다시 작성한다.
upstream 의 server 부분은 Unicorn 측에서 지정한 sock far의 위치를,
루트 부분은 응용 프로그램의 루트 디렉토리를 지정합니다.
/etc/nginx/conf.d/local.confupstream unicorn {
server unix:/home/vagrant/projects/unicorn_sample/tmp/unicorn.sock;
}
server {
listen 80 default_server;
server_name サーバ名;
access_log /var/log/nginx/sample_access.log;
error_log /var/log/nginx/sample_error.log;
root /home/vagrant/projects/unicorn_sample;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}
Nginx를 (재)시작합니다.
$ sudo service nginx restart
동작 확인
http://[도메인 이름]/을 방문하여$ bundle exec rails server -b 0.0.0.0
로 기동했을 경우와 같은 화면이 표시되고 있으면 OK.
Reference
이 문제에 관하여(Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Chef-Solo + Berkshelf로 Rails 4 개발 환경 구축 참고.
다른 서버와는 다른 개인 IP를 할당합니다.
프로젝트 만들기
다음 명령을 실행합니다.
$ mkdir ~/projects/unicorn_sample
$ cd ~/projects/unicorn_sample
$ bundle init
생성된 Gemfile을 다음과 같이 재작성한다.
Gemfilesource 'https://rubygems.org'
gem 'rails', '4.2.0'
다음 명령을 실행합니다.
$ bundle install --path vendor/bundle
$ bundle exec rails new .
...
Overwrite /home/vagrant/projects/unicorn_sample/Gemfile? (enter "h" for help) [Ynaqdh] Y
...
Gemfile을 다음과 같이 다시 씁니다.
Gemfilesource 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'bcrypt', '~> 3.1.7'
gem 'unicorn'
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
end
아래 명령을 실행.
$ bundle install --path vendor/bundle
테스트용 앱 만들기
$ bundle exec rails generate scaffold board title:string text:string
$ rake db:migrate
config/routes.rb
를 아래와 같이 편집
config/routes.rbRails.application.routes.draw do
resources :boards
root “boards#index"
end
아래 명령으로 서버를 시작하고 페이지가 보이는지 확인합니다.
$ bundle exec rails server -b 0.0.0.0
Unicorn 설정
config/unicorn.rb
를 아래의 내용으로 신규로 작성 ( 참고 자료 ).
config/unicorn.rb# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true # 更新時ダウンタイム無し
listen "/tmp/unicorn.sock"
pid "/tmp/unicorn.pid"
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
아래 명령으로 unicorn 시작.
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
기동할 수 있는지 여부는 아래 명령으로 확인할 수 있습니다.
$ ps -ef | grep unicorn | grep -v grep
Unicorn을 중지하려면 다음 명령을 사용하여 프로세스를 Kill합니다.
$ kill -9 [Process ID]
이 상태로 시작 & 종료가 번거롭기 때문에 Rake task에 Unicorn 시작 & 종료 설정을 기술한다.
이 페이지 을 참고했다.
Task 템플릿 파일을 만듭니다.
$ bundle exec rails generate task unicorn
다음 내용으로 변경한다.
lib/tasks/unicorn.rakenamespace :unicorn do
##
# Tasks
##
desc "Start unicorn for development env."
task(:start) {
config = Rails.root.join('config', 'unicorn.rb')
sh "bundle exec unicorn_rails -c #{config} -E development -D"
}
desc "Stop unicorn"
task(:stop) { unicorn_signal :QUIT }
desc "Restart unicorn with USR2"
task(:restart) { unicorn_signal :USR2 }
desc "Increment number of worker processes"
task(:increment) { unicorn_signal :TTIN }
desc "Decrement number of worker processes"
task(:decrement) { unicorn_signal :TTOU }
desc "Unicorn pstree (depends on pstree command)"
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
def unicorn_signal signal
Process.kill signal, unicorn_pid
end
def unicorn_pid
begin
File.read("/tmp/unicorn.pid").to_i
rescue Errno::ENOENT
raise "Unicorn doesn't seem to be running"
end
end
end
아래의 커맨드로 Unicorn을 기동, 정지할 수 있게 된다.
$ bundle exec rake unicorn:start
$ bundle exec rake unicorn:stop
우선, Unicorn을 기동해 둔다.
Nginx 설정
다음 명령으로 설정 파일을 작성합니다.
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
/etc/nginx/conf.d/local.conf
를 다음과 같이 다시 작성한다.
upstream 의 server 부분은 Unicorn 측에서 지정한 sock far의 위치를,
루트 부분은 응용 프로그램의 루트 디렉토리를 지정합니다.
/etc/nginx/conf.d/local.confupstream unicorn {
server unix:/home/vagrant/projects/unicorn_sample/tmp/unicorn.sock;
}
server {
listen 80 default_server;
server_name サーバ名;
access_log /var/log/nginx/sample_access.log;
error_log /var/log/nginx/sample_error.log;
root /home/vagrant/projects/unicorn_sample;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}
Nginx를 (재)시작합니다.
$ sudo service nginx restart
동작 확인
http://[도메인 이름]/을 방문하여$ bundle exec rails server -b 0.0.0.0
로 기동했을 경우와 같은 화면이 표시되고 있으면 OK.
Reference
이 문제에 관하여(Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ mkdir ~/projects/unicorn_sample
$ cd ~/projects/unicorn_sample
$ bundle init
source 'https://rubygems.org'
gem 'rails', '4.2.0'
$ bundle install --path vendor/bundle
$ bundle exec rails new .
...
Overwrite /home/vagrant/projects/unicorn_sample/Gemfile? (enter "h" for help) [Ynaqdh] Y
...
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'bcrypt', '~> 3.1.7'
gem 'unicorn'
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
end
$ bundle install --path vendor/bundle
$ bundle exec rails generate scaffold board title:string text:string
$ rake db:migrate
config/routes.rb
를 아래와 같이 편집config/routes.rb
Rails.application.routes.draw do
resources :boards
root “boards#index"
end
아래 명령으로 서버를 시작하고 페이지가 보이는지 확인합니다.
$ bundle exec rails server -b 0.0.0.0
Unicorn 설정
config/unicorn.rb
를 아래의 내용으로 신규로 작성 ( 참고 자료 ).
config/unicorn.rb# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true # 更新時ダウンタイム無し
listen "/tmp/unicorn.sock"
pid "/tmp/unicorn.pid"
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
아래 명령으로 unicorn 시작.
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
기동할 수 있는지 여부는 아래 명령으로 확인할 수 있습니다.
$ ps -ef | grep unicorn | grep -v grep
Unicorn을 중지하려면 다음 명령을 사용하여 프로세스를 Kill합니다.
$ kill -9 [Process ID]
이 상태로 시작 & 종료가 번거롭기 때문에 Rake task에 Unicorn 시작 & 종료 설정을 기술한다.
이 페이지 을 참고했다.
Task 템플릿 파일을 만듭니다.
$ bundle exec rails generate task unicorn
다음 내용으로 변경한다.
lib/tasks/unicorn.rakenamespace :unicorn do
##
# Tasks
##
desc "Start unicorn for development env."
task(:start) {
config = Rails.root.join('config', 'unicorn.rb')
sh "bundle exec unicorn_rails -c #{config} -E development -D"
}
desc "Stop unicorn"
task(:stop) { unicorn_signal :QUIT }
desc "Restart unicorn with USR2"
task(:restart) { unicorn_signal :USR2 }
desc "Increment number of worker processes"
task(:increment) { unicorn_signal :TTIN }
desc "Decrement number of worker processes"
task(:decrement) { unicorn_signal :TTOU }
desc "Unicorn pstree (depends on pstree command)"
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
def unicorn_signal signal
Process.kill signal, unicorn_pid
end
def unicorn_pid
begin
File.read("/tmp/unicorn.pid").to_i
rescue Errno::ENOENT
raise "Unicorn doesn't seem to be running"
end
end
end
아래의 커맨드로 Unicorn을 기동, 정지할 수 있게 된다.
$ bundle exec rake unicorn:start
$ bundle exec rake unicorn:stop
우선, Unicorn을 기동해 둔다.
Nginx 설정
다음 명령으로 설정 파일을 작성합니다.
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
/etc/nginx/conf.d/local.conf
를 다음과 같이 다시 작성한다.
upstream 의 server 부분은 Unicorn 측에서 지정한 sock far의 위치를,
루트 부분은 응용 프로그램의 루트 디렉토리를 지정합니다.
/etc/nginx/conf.d/local.confupstream unicorn {
server unix:/home/vagrant/projects/unicorn_sample/tmp/unicorn.sock;
}
server {
listen 80 default_server;
server_name サーバ名;
access_log /var/log/nginx/sample_access.log;
error_log /var/log/nginx/sample_error.log;
root /home/vagrant/projects/unicorn_sample;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}
Nginx를 (재)시작합니다.
$ sudo service nginx restart
동작 확인
http://[도메인 이름]/을 방문하여$ bundle exec rails server -b 0.0.0.0
로 기동했을 경우와 같은 화면이 표시되고 있으면 OK.
Reference
이 문제에 관하여(Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true # 更新時ダウンタイム無し
listen "/tmp/unicorn.sock"
pid "/tmp/unicorn.pid"
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
$ ps -ef | grep unicorn | grep -v grep
$ kill -9 [Process ID]
$ bundle exec rails generate task unicorn
namespace :unicorn do
##
# Tasks
##
desc "Start unicorn for development env."
task(:start) {
config = Rails.root.join('config', 'unicorn.rb')
sh "bundle exec unicorn_rails -c #{config} -E development -D"
}
desc "Stop unicorn"
task(:stop) { unicorn_signal :QUIT }
desc "Restart unicorn with USR2"
task(:restart) { unicorn_signal :USR2 }
desc "Increment number of worker processes"
task(:increment) { unicorn_signal :TTIN }
desc "Decrement number of worker processes"
task(:decrement) { unicorn_signal :TTOU }
desc "Unicorn pstree (depends on pstree command)"
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
def unicorn_signal signal
Process.kill signal, unicorn_pid
end
def unicorn_pid
begin
File.read("/tmp/unicorn.pid").to_i
rescue Errno::ENOENT
raise "Unicorn doesn't seem to be running"
end
end
end
$ bundle exec rake unicorn:start
$ bundle exec rake unicorn:stop
다음 명령으로 설정 파일을 작성합니다.
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
/etc/nginx/conf.d/local.conf
를 다음과 같이 다시 작성한다.upstream 의 server 부분은 Unicorn 측에서 지정한 sock far의 위치를,
루트 부분은 응용 프로그램의 루트 디렉토리를 지정합니다.
/etc/nginx/conf.d/local.conf
upstream unicorn {
server unix:/home/vagrant/projects/unicorn_sample/tmp/unicorn.sock;
}
server {
listen 80 default_server;
server_name サーバ名;
access_log /var/log/nginx/sample_access.log;
error_log /var/log/nginx/sample_error.log;
root /home/vagrant/projects/unicorn_sample;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}
Nginx를 (재)시작합니다.
$ sudo service nginx restart
동작 확인
http://[도메인 이름]/을 방문하여$ bundle exec rails server -b 0.0.0.0
로 기동했을 경우와 같은 화면이 표시되고 있으면 OK.
Reference
이 문제에 관하여(Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Rails 4.2 + Unicorn + Nginx로 애플리케이션 서버 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)