最近刚把 Rails Tutorial 走完,想体验一下在 VPS 上部署的过程,用了 Nginx。
然后看到这货有和 Apache virtual host 类似的功能 block server,于是就配了一下。一般的,我就直接这么扔了
/var/www/example.com
/var/www/test.com
/var/www/subdomain.example.com
很好奇各位习惯把各种站点放到哪个目录下呢?倘若这台 VPS 有多个用户,每个同学还有自己的站点。把这些东西放到 /home/username/
会不会方便管理一点?其次对子域名 subdomain.example.com
和 example.com
这两个目录放在同级总感觉怪怪的,有从语义上来讲更加贴切,又便于管理的组织方式么?
Update:
/var/www/example.com/root # web root for example.com
/var/www/example.com/subdomain # web root for your subdomain
这样处理二级域名会不会好一点?
因为阿里云系统盘只有 20G 所以一般就买个 100G 数据盘,然后挂到 /www 然后 /www/web 放网站 /www/git 放 git 库 /www/bak 放一些乱七八糟的比如导出的 sql 之类 /www/log 放 nginx log / rails log 什么的 www/mongodb 放 mongodb 数据库
/var/opt/sites/域名
public 下面是静态资源 nginx 配置了如果 tmp/sockets/web.sock 存在,则 proxy_pass 到它
大致是这样:
# server bound to unix socket: tmp/sockets/web.sock
location @server {
error_log off;
error_page 502 504 = @fallback;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://unix:/var/opt/sites/$http_host/tmp/sockets/web.sock;
}
location @fallback {
return 404;
}
# web root dir: public
location / {
root /var/opt/sites/$http_host/public;
try_files $uri $uri/index.htm $uri/index.html @server;
}
通常这与操作系统的分割规画有关。如果整个硬盘只有一块,放何处是无所谓。讲究的分割,是会把/var,/,/home,/boot 挂在不同分割。硬盘不大时,若不分割,要是 log 塞满了/, 系统就 GG 了,而有把/var 与/挂在不同分割区;万一/var 被塞满,系统最多是无法 log,或者一些需要用到/var 空间的服务无法运作,但还是可以进系统去处理。
web 会有程式及 log,理想的作法是把 log 或会变动的暂存资料放在 /var;而程式相关文档放在其他地方。但我自己用的服务器,就我一人用,所跑的好几个 name-based hosts 都放在 /home/SITES/{site1,site2..} ,虽然用 archlinux + nginx 跑,但觉得 ubuntu 把各 virtual hosts 的各设定档放在 /etc/nginx/sites-available,再sybol link 到 sites-enabled 这种管理方式不错,也仿此方式来设定。
如果服务器是多人使用环境,又不想一个一个设,大概可以要求各用户将其各 virtual host 放置在 ~/myhosts/host{1,2,3}.example.com/htdocs。系统管理者在/var/www 里放 /home/{user}/myhosts 的 symbol link,nginx 只要这种最懒惰的设定就可运行:
listen 80;
server_name _;
access_log /var/log/nginx/$host.access_log main;
error_log /var/log/nginx/$host.access_log info;
root /var/www/$host/htdocs;
用户要设几个 virtual hosts 也不用麻烦到管理者。但要管得真的没有问题,还是需要一个一个或 regular expression 的方式来设定。 在 update 所提的,可参考这种设法:
server {
server_name ~^((?<subdomain>.*)\.)?(?<domain>[^.]+)\.(?<tld>[^.]+)$;
if ($subdomain = "") {
set $subdomain "_";
}
location / {
index index.html;
root /srv/http/vhost/${domain}.${tld}/${subdomain};
}
}