将原本在Apache上运行的Redmine迁移到Nginx的计划
背景和概要
起初我们使用Apache来运行Redmine,但出于兴趣我尝试了一下切换到了Nginx。
趁换过去的机会,我也顺便添加了SSL通信支持。
我本以为只需要将Nginx配置为读取/var/lib/redmine目录就可以了,
但后来发现为了与Passenger进行协作需要重新编译Nginx。
原因如下所述。
为什么Phusion Passenger无法扩展我现有的Nginx?
简单来说,Nginx并不(很好地)支持动态模块加载,
如果要与第三方工具进行协作,就必须重新编译并以静态方式加载。
相比可以动态加载模块的Apache,Nginx在灵活性上似乎有所不足,
但这也正是它能够实现高速运行的原因吧。
规格
-
- CentOS 7.3
-
- Redmine 3.3.3
-
- Postgresql 9.2.18
-
- Ruby 2.3.3
-
- Rails 4.2.7
- ホスト名 www.hogehoge.com
安装Nginx
执行包含乘客的Nginx安装程序。
# passenger-install-nginx-module --auto
与通过yum安装不同,供应商提供的应用程序将被安装在/opt目录下。
权限变更
# chown -R nobody:nobody /opt/nginx
# chown -R 755 /opt/nginx
契约.
修改nginx服务的配置
创建systemd的unit文件。如果已经通过yum等方式安装了,只需编辑几行即可。将原先nginx配置文件所在的/etc/nginx部分替换为新的/opt/nginx。
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but hasthe wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
应用编辑内容并启动nginx服务,并设置自动启动。
# systemctl daemon-reload
# systemctl start nginx
# systemctl enable nginx
SSL支持
证书是根据樱花知识的文章参考,在LetsEncrypt上颁发的。
由于在21世纪,将所有的Web访问协议都加密为HTTPS是时尚的做法,所以我们决定将对80号端口的访问全部重定向到443号端口。
顺便说一下,那时候发生了一个小麻烦。我误以为在Nginx上的重定向失败了。
首先,确认乘客位置的设置如下。
# passenger-config --root
在我所处的环境中,
在我所处的情况下,
在我的环境里,
根据我所在的环境,
依据我周围的环境,
/usr/local/lib/ruby/gems/2.3.0/gems/passenger-5.1.4
被标注为。
在HTTP上下文的开头添加以下5行。
http {
user nobody;
pid /opt/nginx/logs/nginx.pid;
passenger_root /usr/local/lib/ruby/gems/2.3.0/gems/passenger-5.1.4;
passenger_ruby /usr/local/bin/ruby;
include /opt/nginx/conf/conf.d/*.conf;
...
}
接下来,将服务器上下文修改为以下方式。
server {
listen 80;
server_name www.hogehoge.com;
return 301 https://$host$request_uri;
}
设置等待通过443端口进行SSL通信。
server {
listen 443 ssl;
server_name www.hogehoge.com;
root /var/www/html/;
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/privkey.pem;
...
}
通过浏览器访问http://www.hogehoge.com/,将会被重定向到https://www.hogehoge.com/,并读取宿主操作系统下的/var/www/html/目录及其内容。
与Redmine的整合
https://www.hogehoge.com/redmine/でアクセスできるようにする.
/var/lib/redmine 以下にコンテンツが配置してあるとする.
将Redmine相关文件的所有者更改为nginx用户。
# chown -R nginx:nginx /var/lib/redmine
在SSL通信的配置文件中,添加以下内容:
http {
listen 443 ssl;
...
+ 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-Server $host;
+ proxy_set_header X-Forwarded-Host $host;
server {
listen 443 ssl;
server_name www.hogehoge.com;
root /var/www/html/;
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/privkey.pem;
...
+ location ~ ^/redmine {
+ passenger_base_uri /redmine;
+ passenger_app_root /var/lib/redmine;
+ passenger_enabled on;
+ rails_env production;
+ access_log /var/log/redmine_access.log;
+ error_log /var/log/redmine_error.log;
}
...
}
...
}
如果能够通过浏览器访问https://www.hogehoge.com/redmine/并且显示如下内容,那就可以了。

上面提到的。
這次想在HTTPS後面運行Docker容器,
嘗試創建一個安全的WebHook。
请提供更多的上下文或要求,以便我可以为您提供一个恰当的翻译。
-
- CentOS7にRedmineをインストールし、nginxのサブフォルダで公開する。
- Redmine 3.3をCentOS 7.3にインストールする手順