我有一个特殊的URI方案,这给我带来了麻烦。我需要运行nodejs来提供以下服务:
domain.com var.domain.com var.domain.com/foo/
我有这项工作没有问题,可以express.vhost()用来提供子域。但是,一旦URI类似于以下内容,我就需要提供静态内容和php:
express.vhost()
var.domain.com/foo/bar var.domain.com/foo/bar/index.php
这/bar/是我服务器上的某个目录。从该url下来的所有内容(例如/bar/images/favicon.ico)都将像您的典型目录方案一样工作。通常,我会将典型的proxy_pass传递给在某个端口上运行的节点,但是正如您在此处看到的那样,我需要nodejs成为端口80上的主要处理程序,并将请求传递给在其他端口上运行的nginx(或者是否可以/更简单地解决?)。
/bar/
/bar/images/favicon.ico
(nginx / php)/ nodejs配置是否可以使用这种方案?
Nginx允许非常灵活的请求路由。我会告诉你一种设置方法
我喜欢,并且我认为这是大多数发行版的默认安装布局,conf.d并vhosts.d带有active和available文件夹。因此,我只需删除符号链接即可轻松禁用虚拟主机或配置文件。
conf.d
vhosts.d
active
available
/etc nginx.conf vhosts.d/ active available conf.d/ active available
/etc/nginx.conf
# should be 1 per CPU core worker_processes 2; error_log /var/log/nginx/error.log; # I have this off because in our case traffic is not monitored with nginx and I don't want disks to be flooded with google bot requests :) access_log off; pid /var/run/nginx.pid; events { # max clients = worker_processes * worker_connections worker_connections 1024; # depends on your architecture, see http://wiki.nginx.org/EventsModule#use use epoll; } http { client_max_body_size 15m; include mime.types; default_type text/html; sendfile on; keepalive_timeout 15; # enable gzip compression gzip on; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/x-javascript application/atom+xml application/rss+xml application/json; gzip_http_version 1.0; # Include conf.d files include conf.d/active/*.conf; # include vhost.d files include vhosts.d/active/*.conf; }
/etc/nginx/vhosts.d/available/default.conf
说我们静态文件的文档根是 /srv/www/vhosts/static/htdocs
/srv/www/vhosts/static/htdocs
server { server_name _; listen 80; root /srv/www/vhosts/static/htdocs; # if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js try_files $uri @nodejs; # may want to specify some additional configuration for static files location ~ \.(js|css|png|gif|jpg) { expires 30d; } location @nodejs { # say node.js is listening on port 1234, same host proxy_pass 127.0.0.1:1234; break; } # just for fun or because this is another application, we serve a subdirectory via apache on another server, also on the other server it's not /phpmyadmin but /tools/phpMyAdmin location /phpmyadmin { rewrite /phpmyadmin(.*)$ /tools/phpMyAdmin$1; proxy_pass 10.0.1.21:80; break; } # files with .php extension should be passed to the php-fpm backend, socket connection because it's on the same and we can save up the whole tcp overhead location ~\.php$ { fastcgi_pass unix:/var/run/php-fpm.sock; include /etc/nginx/fastcgi_params; break; } }
创建一个符号链接以激活默认虚拟主机
ln -s /etc/nginx/vhosts.d/available/default.conf /etc/nginx/vhosts.d/active/. /etc/init.d/nginx restart
看看nginx配置语言多么简单直观?我只是喜欢它:)