nginx反向代理(端口转发)

nginx配合nodejs做代理,进行端口转发。

安装 nginx

1
sudo apt-get install nginx

nginx 文件结构

  • 所有的配置文件都在 /etc/nginx 下,并且每个虚拟主机已经安排在了 /etc/nginx/sites-available 下
  • 程序文件在 /usr/sbin/nginx
  • 日志放在了 /var/log/nginx 中
  • 并已经在 /etc/init.d/ 下创建了启动脚本 nginx
  • 默认的虚拟主机的目录设置在了 /var/www/nginx-default (有的版本 默认的虚拟主机的目录设置在了 /var/www, 请参考 / etc/nginx/sites-available 里的配置)

启动 nginx

1
sudo /etc/init.d/nginx start

配置 Nginx

代理

  • /etc/nginx/sites-available 记录代理配置
  • /etc/nginx/sites-enabled 启动已配置好的代理
  • 先在 /etc/nginx/sites-available 配置代理
  • /etc/nginx/sites-enabled 下创建symbol link链接available下的配置文件以启用代理配置

主要配置

1
2
3
4
5
6
7
8
9
10
11
12
server {
# 监听的端口号
listen 80;

# 监听的域名
server_name: a.b.com;

# 转发规则
localtion / {
proxy_pass http://a.b.com:port;
}
}

转发规则

我用的是nodejs+express,内部已经定义了静态资源服务,所以可以直接将所有的请求直接转发给node服务,以作出相应。若非上游服务做静态资源服务,可以在location模块定义资源目录。

  • location后的地址(rul匹配)十分灵活,接受正则。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    location = / {
    # 完全匹配 =
    # 大小写敏感 ~
    # 忽略大小写 ~*
    }

    location ^~ /images/ {
    # 前半部分匹配 ^~
    # 可以使用正则,如:
    # location ~* \.(gif|jpg|png)$ { }
    }

    location / {
    # 如果以上都未匹配,会进入这里
    }
  • root 定义该匹配后的处理路径根目录
  • index 定义首页(按顺序,以此尝试访问)
    1
    2
    3
    4
    location / {
    root /home/wwwroot/bitzo/;
    index index.html index.htm
    }
  • 反向代理:proxy_pass
  • 还有其他相关的代理配置,等了解了再慢慢加在这。。。

一个坑

在配置的时候我没注意,location里一直加着 try_files $uri $uri/ =404, 导致除了主页面,访问其他一切资源全部都404。之后将这条语句注释掉即可成功。目前还不太清楚为什么。惨惨惨。