nginx是前端开发中使用的典型服务器,俗话说温故而知新,下面对nginx进行温故,看看能否知新。
一、HTTP服务器
nginx本身是一个静态资源的服务器,当只有静态资源的时候,就可以使用nginx来做服务器,如一个网站只是静态页面,就可以通过这种方式来实现部署。
1、首先在根目录下创建html目录,如/usr/local/www,然后在html目录中放一个test.html。
2、配置nginx.conf中的server
http {
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
# 默认location
location / {
root /usr/local/www/html;
index index.html index.htm;
}
}
}
3、访问
http://localhost/指向/usr/local/www/index.html,index.html是安装nginx自带的html;
http://localhost/test.html指向/usr/local/www/html/test.html,test.html是自定义的html;
4、指令
- server:用于定义服务,http中可以有多个server块;
- listen:用于指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口;
- server_name:用于配置服务名称或用于配置域名;
- location:用于配置映射路径uri对应的配置,一个server中可以有多个location,location后面跟一个uri,可以是一个正则表达式,/ 表示匹配任意路径,当客户端访问的路径满足这个uri时就会执行location块里面的代码;
- root:用于配置根路径,当访问http://localhost/test.html,“/test.html”会匹配到”/”uri,找到root为/usr/local/www/html,用户访问资源的物理地址=root + uri = /usr/local/www/html + /test.html=/usr/local/www/html/test.html;
- index:用于设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源;如果访问http://localhost/html/则默认返回index.html;
5、location uri正则表达式
- ?:重复0次或1次;
- +:重复1次或更多次;
- *:重复0次或更多次;
- .:匹配除换行符以外的任意字符;
- \d:匹配数字;
- ^:匹配字符串的开始;
- $:匹配字符串的结束;
- [c]:匹配单个字符c;
- [a-z]:匹配a-z小写字母的任意一个;
- {n}:重复n次;
- {n,}:重复n次或更多次;
- \:用于转义特殊字符;
二、静态服务器
静态服务器提供静态资源访问功能,如需要静态资源就从静态资源服务器中获取。
1、首先在根目录下创建images和img目录,分别放一张test.jpg。
2、配置nginx.conf中的server
http {
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/www;
# 默认location
location / {
root /usr/local/www/html;
index index.html index.htm;
}
location ^~ /images/ {
root $doc_root;
}
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
}
}
自定义变量使用set指令,如自定义了doc_root变量。
3、location映射
静态服务器location映射一般有两种方式:
- 使用路径:如 /images/ 一般图片都会放在某个图片目录下;
- 使用后缀:如 .jpg、.png 等后缀匹配模式;
访问http://localhost/test.jpg会映射到
d
o
c
r
o
o
t
/
i
m
g
;访问
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
/
i
m
a
g
e
s
/
t
e
s
t
.
j
p
g
会映射到
doc_root/img; 访问http://localhost/images/test.jpg会映射到
docroot/img;访问http://localhost/images/test.jpg会映射到doc_root,当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于~, 所以会走/images/对应的location;
4、location映射匹配
- =:进行普通字符精确匹配;
- ^~:前缀匹配,如果匹配成功,则不再匹配其他location;
- ~:正则匹配,区分大小写;
- ~*:正则匹配,不区分大小写;
- /xxx/:常规字符串路径匹配;
- /:通用匹配,任何请求都会匹配到;
5、location优先级
当一个路径匹配多个location时,究竟那个location能匹配到是有优先级顺序的,而优先级的顺序与location值的表达式类型有关,和在配置文件中的先后顺序无关,相同类型的表达式,字符串长的会优先匹配。
- =:优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索;
- ^~:一旦匹配成功,则不再查找其他匹配项,停止搜索;
- ~:优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个;
- /xxx/:按前缀匹配;
- /:如果没有匹配到,就匹配通用的;
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
其中location的优先级与location配置的位置无关。
三、反向代理
反向代理是nginx使用最多的功能,反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理通过proxy_pass指令来实现,如下
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host:$server_port;
}
}
四、负载均衡
负载均衡,就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器和其它关键任务服务器等,从而共同完成工作任务。
负载均衡常用策略如下:
- 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置;
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
#access_log logs/host.access.log main;
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
}
- 权重:指定轮询几率,weight和访问比率成正比, 也就是服务器接收请求的比例就是各自配置的weight的比例,用于后端服务器性能不均的情况,比如服务器性能差点就少接收点请求,服务器性能好点就多处理点请求;
upstream test {
server localhost:8081 weight=1;
server localhost:8082 weight=3;
server localhost:8083 weight=4 backup;
}
其中,若是4次请求,则只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走8083。
- ip_hash:上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题;
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
五、动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/www;
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root;
}
}
六、内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。
- $content_length:请求头中的Content-length字段;
- $content_type:请求头中的Content-Type字段;
- $document_root:当前请求在root指令中指定的值;
- $host:请求主机头字段,否则为服务器名称;
- $http_user_agent:客户端agent信息;
- $http_cookie:客户端cookie信息;
- $limit_rate:这个变量可以限制连接速率;
- $request_method:客户端请求的动作,通常为GET或POST;
- $remote_addr:客户端的IP地址;
- $remote_port:客户端的端口;
- $server_protocol:请求使用的协议,通常是HTTP/1.0或HTTP/1.1;
- $server_addr:服务器地址;
- $server_name:服务器名称;
- $server_port:请求到达服务器的端口号;
在工程应用中还需不断应用和尝试。