34 部署Rails应用之服务器配置与优化
在上一章中,我们学习了如何将Rails应用部署到Heroku上,这对于小型项目或原型开发非常方便。而对于生产环境中的应用,通常我们需要更加灵活和高效的配置方案。这一章将探讨如何在一个独立的服务器上配置和优化Rails应用,从而确保其可以高效地运行。
服务器选择与环境准备
在配置Rails应用之前,我们首先需要选择一个合适的服务器。常用的选择有:
- 虚拟私人服务器(VPS):如DigitalOcean、Linode、AWS EC2等。
- 云托管服务:如Google Cloud、AWS等提供的托管解决方案。
基础环境配置
一旦选择了服务器,您需要进行一些基本的环境配置。以下是一个使用Ubuntu的基本环境配置步骤:
# 更新系统
sudo apt-get update
sudo apt-get upgrade
# 安装必要的依赖
sudo apt-get install -y curl gnupg build-essential
# 安装Ruby管理工具(如rbenv)
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-installer | bash
# 更新.bashrc或.zshrc文件,添加rbenv到路径
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
# 安装Ruby版本
rbenv install 3.1.0
rbenv global 3.1.0
# 安装Bundler
gem install bundler
安装Rails
在完成Ruby的安装后,我们可以安装Rails:
gem install rails
数据库配置
Rails默认使用SQLite,但在生产环境中,通常更倾向于使用PostgreSQL或MySQL。以PostgreSQL为例,我们安装并配置数据库:
# 安装PostgreSQL
sudo apt-get install -y postgresql postgresql-contrib libpq-dev
# 创建数据库用户
sudo -u postgres createuser -s yourusername
# 创建数据库
createdb yourapp_production
在config/database.yml
文件中配置数据库连接:
production:
adapter: postgresql
encoding: unicode
database: yourapp_production
pool: 5
username: yourusername
password: yourpassword
host: localhost
Rails应用的配置与启动
在应用根目录下,编写并修改配置文件以满足生产环境的需求。然后,我们可以启动应用。
Puma作为应用服务器
选择Puma作为应用服务器,它是Rails的推荐选择之一。在Gemfile
中添加:
gem 'puma'
然后运行:
bundle install
启动Puma
使用以下命令启动Puma服务器:
bundle exec puma -C config/puma.rb
配置文件config/puma.rb
的示例:
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackApp
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end
Nginx作为反向代理
为了处理静态文件并作为反向代理,我们通常使用Nginx。安装Nginx:
sudo apt-get install -y nginx
配置Nginx
在/etc/nginx/sites-available/yourapp
中创建配置文件:
server {
listen 80;
server_name your_domain.com;
root /path/to/your/app/public;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $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;
}
location ~ ^/(assets|packs)/(.*)$ {
expires max;
add_header Cache-Control 'public';
}
}
然后创建链接并重启Nginx:
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/
sudo systemctl restart nginx
SSL配置与优化
为了确保数据安全,您应该在生产环境中使用SSL。一种简单的方法是使用Let's Encrypt来申请免费证书。
安装Certbot并进行配置:
sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com
跟随提示完成证书申请和Nginx自动配置。
性能优化
在确保Rails应用能在生产中运行后,我们可以进行一些优化:
- 缓存:使用
Redis
或Memcached
进行页面缓存和数据缓存。 - 静态资源预编译:在生产环境中,确保运行
rails assets:precompile
以生成静态资源。 - 数据库连接池:在
database.yml
中,调整pool
大小,以适应并发请求。 - 异步任务:使用
Sidekiq
处理后台任务,提高响应速度。
示例关于使用Redis缓存的代码:
# Gemfile
gem 'redis'
gem 'sidekiq'
# config/initializers/redis.rb
$redis = Redis.new(url: ENV['REDIS_URL'])
总结
本章重点介绍了如何在独立服务器上配置和优化Rails应用。通过建立合适的服务器环境、配置数据库、使用合适的应用服务器、设置反向代理以及实现SSL加密,我们可以为生产环境中的Rails应用提供出色的服务。同时,不要忘记进行性能优化,以确保应用能高效响应用户请求。
在下一章中,我们将探讨如何通过使用Gem来扩展Rails应用的功能。我们将讨论一些流行的Gem以及如何集成它们到我们的Rails项目中。