Note:任何形式的转载请注明原文
本文指令都是按管理员权限执行,如果遇到权限问题请
sudo
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。
HTTP请求是80端口,但是在Linux上非root权限是无法使用1024以下端口的,并且因为安全原因,最好不要使用root权限登录服务器,所以无法直接用
node.js
或Tomcat
程序监听80端口。因此我们需要使用Nginx给我们的程序做反向代理,将80端口指向应用程序监听的端口(如node.js默认3000
端口,Tomcat 默认8080
端口)。
安装Nginx
配置Nginx源
vim /etc/yum.repos.d/nginx.repo
敲击i
输入下面代码,按Esc
并输入:wq!
保存退出
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
通过yum安装Nginx
yum install nginx
启动 / 重启 Nginx
systemctl start nginx
systemctl restart nginx
修改配置文件
样例配置
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
location /favicon.ico {
root html;
}
}
这里的
listen
指监听端口,server_name
用来指定IP或域名,多个域名对应统一规则可以空格分开,index
用于设定访问的默认首页地址,root
指令用于指定虚拟主机的网页跟目录,这个地方可以是相对地址也可以是绝对地址。
当用户访问localhost/favicon.ico时,会寻找nginx安装目录
/html/favicon.ico
通常情况下我们可以在 nginx.conf 中配置多个server,对不同的请求进行设置。
server {
listen 80;
server_name www.a.com;
charset utf-8;
access_log /home/a.com.access.log main;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 80;
server_name www.b.com;
charset utf-8;
access_log /home/b.com.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
但是当 server 超过2个时,建议将不同对虚拟主机的配置放在另一个文件中,然后通过在主配置文件 nginx.conf 加上 include 指令包含进来。更便于管理。
include vhosts/*.conf;
location 匹配规则
~ 波浪线表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配
具体匹配例子
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
请求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
静态文件映射
访问文件的配置主要有 root 和 aliasp's 两个指令。
alias
alias后跟的指定目录是准确的,并且末尾必须加 /。
location /c/ {
alias /a/;
}
root
root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行。
location /c/ {
root /a/;
}
这时访问站点http://location/c
访问的就是/a/c
目录下的站点信息。
如果你需要将这个目录展开,在这个location的末尾加上「autoindex on; 」就可以了
转发
这个很简单,指定IP和端口直接转发过去就可以了.譬如转发到localhost的3000端口
location / {
proxy_pass localhost:3000;
}
负载均衡
我们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 ip_hash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。另外还有轮询、指定权重轮询、fair、url_hash几种调度算法。
upstream myserver; {
ip_hash;
server 172.16.1.1:8001;
server 172.16.1.2:8002;
server 172.16.1.3;
server 172.16.1.4;
}
location / {
proxy_pass http://myserver;
}
结束语
以上是最简单的通过 nginx 实现静态文件转发、反向代理和负载均衡的配置。在 nginx 中所有的功能都是通过模块来实现的,比如当我们配置 upstream 时是用 upstream 模块,而 server 和 location 是在 http core 模块,其他的还有流控的 limt 模块,邮件的 mail 模块,https 的 ssl 模块。他们的配置都是类似的可以再 nginx 的模块文档中找到详细的配置说明。