- Published on
- Authors
- Name
- UniClown
- @uniclown
UCTW V4.0
服务器做了一次迁移,从heroku搬到了GCP 老是坐在heroku也不是办法,虽然部署还算方便,也是免费的机房 但是总想试着部署到自己的服务器上,方便今后的扩展 GCP有一年免费和300美金赠送,而且速度快的可怕 搬迁过程中遇到了很多问题 还好都有解决方法 这里汇总一下内容 方便下次迁移
数据库的迁移
heroku线上使用的是postgres GCP上我打算使用mysql
- 首先从heroku备份数据库
heroku pg:backups:capture
- 下载最新的备份latest.dump
heroku pg:backups:download
- 将备份还原到本地pg数据库中
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
- 用本地pg数据库导出sql
pg_dump -U myuser -s mydb --inserts --format p -f pg.sql
- pg2mysql将pg.sql的语句转化为Mysql的语句获得mysql.sql
- 服务器执行
rake db:migrate RAILS_ENV=production
- 删除mysql.sql中的数据迁移表,然后导入
- 配置 数据库 自动备份 详见
其实6、7两步是可以简化的,直接导入mysql.sql到mysql中就可以了,不需要rails去建立数据库
ROR的部署
采用的是nginx+unicorn的配置
编译静态文件
$ RAILS_ENV=production rake assets:clean
$ RAILS_ENV=production rake assets:precompile
配置文件unicorn.rb
module Rails
class <<self
def root
File.expand_path(__FILE__).split('/')[0..-3].join('/')
end
end
end
worker_processes 4
working_directory Rails.root
listen "#{Rails.root}/tmp/sockets/socket", :backlog =>
64
timeout 30
pid "#{Rails.root}/tmp/pids/unicorn.pid"
stderr_path "#{Rails.root}/log/unicorn.log"
stdout_path "#{Rails.root}/log/unicorn.log"
# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
GC.copy_on_write_friendly = true
check_client_connection false
before_fork do |server, worker|
# the following is highly recomended for Rails + "preload_app true"
# as there's no need for the master process to hold a connection
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && old_pid != server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
# Throttle the master from forking too quickly by sleeping. Due
# to the implementation of standard Unix signal handlers, this
# helps (but does not completely) prevent identical, repeated signals
# from being lost when the receiving process is busy.
sleep 1
end
after_fork do |server, worker|
# the following is *required* for Rails + "preload_app true",
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
# if preload_app is true, then you may also want to check and
# restart any other shared sockets/descriptors such as Memcached,
# and Redis. TokyoCabinet file handles are safe to reuse
# between any number of forked children (assuming your kernel
# correctly implements pread()/pwrite() system calls)
end
unicorn的运行方法
unicorn_rails -c /path/to/app/config/unicorn.rb -D -E production
unicorn的热部署
sudo kill -USR2 `cat path/to/app/tmp/pids/unicorn.pid`
因为unicorn的设置中有多个进程,所以需要多次执行此操作
nginx的配置文件
upstream app{
server unix:///path/to/app/tmp/sockets/socket;
}
server {
listen 80;
server_name app;
root path/to/app/public;
try_files $uri/index.html $uri.html $uri @app;
location ~ ^/(assets)/ {
expires max;
add_header Cache-Control public;
}
location ~ .*\.(php|sql|asp)?$ {
deny all;
}
location @app {
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_redirect off;
proxy_pass http://app;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
access_log logs/app.log;
}
安装mysql、php、phpmysql
搜索引擎优化
添加了sitemap 通过/sitemap.xml访问 添加了百度的统计api
TODO
- 数据库的备份到网盘
- wechat中的投票项目
- 与微信项目的联动