我正在尝试正确设置 Play 框架并使用 Nginx 作为 Amazon AMI 上的前端 HTTP 服务器。
我有点困惑Play 提供的官方文件。他们建议你跑
start -Dhttp.port=9000
然后配置 Nginx 重新路由到端口 9000,以便正确提供我的应用程序?我觉得让专门的用户运行启动命令太浪费了,难道没有更好的方法吗?
我真的很感激一些针对生产 Play Framework Web 应用程序的最佳实践的基本策略。
答案1
我使用专用用户的原因是为了能够在一台机器上放置多个不同的环境,它们都通过单独的用户 ID 避免相互干扰。例如,我们有一个名为“d1”的应用程序,我们必须将其放入多个环境中,因此每个环境都有一个用户:
d1测试 d1开发 d1夜间
为了每晚构建nginx.conf
如下外观:
upstream d1nightly {
ip_hash;
server 127.0.0.1:20101;
server 127.0.0.1:20102;
}
server {
listen 443 ssl;
server_name nightly.d1.org;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!ADH:!MD5;
ssl_prefer_server_ciphers on;
location /500x.html {
alias /usr/share/nginx/html/500x.html;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http:// https://;
add_header Pragma "no-cache";
proxy_pass http://d1nightly;
error_page 500 502 503 504 /500x.html;
}
}
现在当我们去nightly.d1.org我们获得了夜间发布的内容。
我们按每台虚拟机每小时支付固定费用,而不是按 CPU 时间支付,因此,通过在测试期间将 3 或 4 个环境打包到一台机器上,我们可以利用这种组合获得更高的性价比。
为了启动播放应用程序,我有一个非常基本的 shell 脚本函数:
function startPlayAppd1 {
#start a d1 play app with appropriate system properties
nohup ${base_directory}/${app}-latest-${jvm}/${snapshot_name}/start \
-Dhttp.port=${listen_port} \
-Denv.name=${env_name} \
-Dlogger.file=${logger_file} \
-Dsession.secure=${session_secure} \
-Dga.domain=${ga_domain} \
-Djava.net.preferIPv4Stack=${preferIPv4Stack} \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=${jmx_port} \
-Dcom.sun.management.jmxremote.authenticate=${jmx_remote_authenticate} \
-Dcom.sun.management.jmxremote.password.file=jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=false \
-Djavax.net.debug=${javaxDebugLevel} \
> ${listen_port}.nohup 2>&1 &
sleep 5
}
每个用户环境的另一个优点是它所创造的灵活性。
如您所见,已添加了各种系统属性,例如启用 JMX,以便我们的监控工具可以观察播放应用程序。
这是一个对于我们的用例来说非常有效的解决方案。