配置 unicorn 和 nginx 运行 Redmine

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Redmine 支持多种服务器配置, Web 服务器可选择 nginx 或 apache, Ruby 应用服务器可选择 unicorn, passenger, puma 或 thin。 Easy Redmine 的官方安装文档推荐使用 nginx + unicorn 运行 Easy Redmine 并给出了详细的安装配置手册。

Redmine 支持多种服务器配置, Web 服务器可选择 nginxapache, Ruby 应用服务器可选择 unicorn, passenger, pumathin

Easy Redmine官方安装文档推荐使用 nginx + unicorn 运行 Easy Redmine 并给出了详细的安装配置手册。本文记录配置 unicorn 和 nginx 运行 Redmine 的过程,包括常见问题和简单的问题排查方法。

环境

以下是配置前的环境:

  • 阿里云 1 核 2G 云服务器
  • Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-117-generic x86_64)
  • nginx 1.10.3-0ubuntu0.16.04.3
  • rvm 1.29.4
  • ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]
  • Rails 4.2.8
  • Redmine 3.4.6
  • Redmine 运行用户: redmine
  • Redmine 工作目录: /data/redmine/redmine

配置 unicorn

安装 unicorn

unicorn 可以作为一个 gem 单独安装,如:

gem install unicorn

也可以只安装在当前 Redmine 环境中

cat >> /data/redmine/redmine/Gemfile.local << EOF
gem 'unicorn'
EOF
cd /data/redmine/redmine
bundle install --without development test

生成 unicorn 配置文件

执行以下命令生成 unicorn 配置文件,文件名为 /data/redmine/redmine/config/unicorn.rb。

需要注意的是:

  • worker_processes 建议设置为与CPU核数一致
  • Web 服务器运行用户 (www-data 或 nginx) 和 Redmine 运行用户 ( 本文中为 redmine) 应具有 redmine_unicorn.sock 的读写权限
cat > /data/redmine/redmine/config/unicorn.rb << EOF
app_home="/data/redmine/redmine"

worker_processes 2
timeout 3600
preload_app true

listen "/tmp/redmine_unicorn.sock", :backlog => 64
pid "/tmp/redmine_unicorn.pid"

stdout_path "#{app_home}/log/unicorn.log"
stderr_path "#{app_home}/log/unicorn.err"

before_fork do |server, worker|
  # Close all open connections
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if 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
end

after_fork do |server, worker|
  # Reopen all connections
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end
EOF

生成服务脚本并配置为开机启动

以 root 权限执行以下命令生成服务脚本,需要注意修改脚本中的以下变量为实际值:

  • User
  • WorkingDirectory
  • PIDFile
  • ExecStart 中的命令字符串,尤其是其中的 unicorn 配置文件路径
cat > /etc/systemd/system/redmine.service << EOF
[Unit]
Description=Redmine server system service

[Service]
Restart=on-failure
Type=simple
User=redmine
WorkingDirectory=/data/redmine/redmine
Environment=RAILS_ENV=production
PIDFile=/tmp/redmine_unicorn.pid
ExecStart=/bin/bash -lc 'rvm default do unicorn -D -c /data/redmine/redmine/config/unicorn.rb -E production'

[Install]
WantedBy=multi-user.target

EOF

其中 ExecStart 中的命令字符串应根据 unicorn 的安装方式进行调整,上面的例子针对 unicorn 作为一个独立安装的 gem 的情况。而如果 unicorn 写入在 Gemfile.local 中,并执行了 bundle install, ExecStart 中的命令字符串应改为:

bundle exec unicorn -D -c /data/redmine/redmine/config/unicorn.rb -E production

可按照 redmine.service 中的 User 和 WorkingDirectory 执行 ExecStart 中的命令字符串,验证命令能执行成功。

如果测试没有问题,以 root 权限执行以下命令启动服务并检查服务状态:

systemctl daemon-reload
systemctl start redmine.service
systemctl enable redmine.service
systemctl status redmine.service

如果一起正常,可以看到服务状态为正在运行,执行以下命令可以看到系统中多了若干 ruby 进程,进程数目与 unicorn 配置文件中的 worker_processes 数量相关。

ps -e | grep ruby

如果出现问题,可以查看 unicorn 配置文件中的指定的日志文件。

配置 nginx

以 root 权限新建文件 /etc/nginx/conf.d/redmine.conf, 文件内容可参考如下:

upstream unicorn {
  # for UNIX domain socket setups:
  server unix:/tmp/redmine_unicorn.sock fail_timeout=0;
}

server {
  listen        80;
  # the aplication will listen on all server names  
  server_name   _;
  error_log /var/log/nginx/redmine_error.log;
  access_log /var/log/nginx/redmine_access.log;

  root                          /data/redmine/redmine/public;
  try_files                     $uri @app;
  error_page                    500 502 503 504 /500.html;

  location @app {
    proxy_pass                  http://unicorn;
    proxy_set_header            Host $http_host;
    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header            X-Forwarded-Proto $scheme;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;
  }
}

其中:

  • sock 文件需要与 unicorn 配置文件一致
  • 主机名和监听端口号应与实际匹配

详细配置可参见 nginx 官网上的 ngx_http_upstream_module

以 root 权限重新加载 nginx 并查看启动状态:

service nginx reload
service nginx status

此时即可以通过浏览器访问 Redmine。

常见问题及处理

如果出现配置错误,有可能出现各种问题,此时应查看日志文件中描述的错误原因,有针对性的进行解决。

redmine.service 状态异常

问题原因有可能是:

  • Redmine 本身配置
  • unicorn 配置文件中有错误
  • redmine.service 中有错误

具体原因可查看 unicorn 配置文件指定的日志文件,或者逐步排查,如通过运行 redmine.service 中的启动命令排查问题:

su - redmine
cd ~/redmine
bundle exec unicorn -D -c /data/redmine/redmine/config/unicorn.rb -E production

连接 upstream 错误

在 nginx 日志文件中,出现以下错误:

2018/12/12 11:58:09 [crit] 1927#1927: *1 connect() to unix:/tmp/redmine_unicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.1.51, server: www.eaglesoftware.cn, request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/redmine_unicorn.sock:/", host: www.eaglesoftware.cn, referrer: "https://www.eaglesoftware.cn/"

此时说明 Web 服务器运行用户没有 /data/redmine/redmine/redmine_unicorn.sock 文件的读写权限,可使用类似以下命令测试用户对文件的访问权限。

sudo -u www-data stat /data/redmine/redmine/redmine_unicorn.sock

Web 服务器运行用户可通过查看配置文件获取,如对 nginx, 可查看 /etc/nginx/nginx.conf 文件。

cat /etc/nginx/nginx.conf | grep user

注意 Web 服务器运行用户需要首先对存放 redmine_unicorn.sock 的目录具有执行权限,才可能访问该文件。一般通过以下方式可修复此错误:

  • 改动 redmine_unicorn.sock 的存储位置
  • 将 Web 服务器运行用户加入 redmine_unicorn.sock 文件所属的用户组
  • 运行 chmod 更改组或其它用户对该文件的访问权限
  • 运行 chmod 增加组或其它用户对 redmine_unicorn.sock 所在目录的执行权限
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9天前
|
应用服务中间件 Linux nginx
Jetson 环境安装(四):jetson nano配置ffmpeg和nginx(亲测)之编译错误汇总
这篇文章是关于在Jetson Nano上配置FFmpeg和Nginx时遇到的编译错误及其解决方案的汇总。
46 4
|
5天前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
112 0
|
4天前
|
前端开发 JavaScript 应用服务中间件
终极 Nginx 配置指南
本文介绍了Nginx的基本配置及其优化方法。首先,通过删除注释简化了Nginx的默认配置文件,使其更易于理解。接着,文章将Nginx配置文件分为全局块、events块和http块三部分进行详细解释。此外,还提供了如何快速上线网站、解决前端history模式404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离的具体配置示例。最后,附上了Nginx的基础命令,包括安装、启动、重启和关闭等操作。
|
8天前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
33 7
|
6天前
|
缓存 前端开发 JavaScript
一、nginx配置
一、nginx配置
54 1
|
5天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
38 0
|
7天前
|
缓存 监控 负载均衡
nginx相关配置及高并发优化
Nginx的高并发优化是一个综合性的过程,需要根据具体的业务场景和硬件资源量身定制。以上配置只是基础,实际应用中还需根据服务器监控数据进行持续调整和优化。例如,利用工具如ab(Apache Benchmarks)进行压力测试,监控CPU、内存、网络和磁盘I/O等资源使用情况,确保配置的有效性和服务的稳定性。
51 0
|
10天前
|
编解码 Ubuntu 应用服务中间件
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
本文介绍了在NVIDIA Jetson Nano上配置FFmpeg和Nginx的步骤,包括安装、配置和自启动设置。
69 1
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
|
10天前
|
缓存 前端开发 应用服务中间件
CORS跨域+Nginx配置、Apache配置
CORS跨域+Nginx配置、Apache配置
49 7
|
15天前
|
存储 缓存 监控