什么是Nginx
Nginx是一个高性能的HTTP和反向代理web服务器。基于C语言开发。具有高可靠、低内存消耗耗、高扩展性、支持高并发、热部署,更自由的协议的特点,同时负载均衡、反向代理、动静分离的特性使得nginx成为现在最受欢迎的服务器。
反向代理
在了解反向代理之前,我们先了解下与之相对的正向代理:
正向代理:为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。在这种情况下,最终用户知道代理服务器和原始服务器的存在,只是处于某种原因,无法直接访问原始服务器。(类似科学上网)
反向代理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。且不需要做任何设置。在这种情况下,最终用户不知道原始服务器的存在,并认为反代理服务器就是目标服务器。
负载均衡
Load Balance ,简单来说是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行以解决高性能,单点故障(高可用),扩展性(水平伸缩)等高流量下常见的问题。
动静分离
Nginx将客户端请求进行分类转发,静态资源请求(html、图片、css等文件)由静态资源服务器进行处理,动态资源(jsp、servlet等)由动态服务器进行处理。改变之前由动态服务器处理两种请求的方式,减轻了动态服务器的负担,提高了整体性能。
常用命令
启动命令(执行sbin下的nginx)
1.普通启动(加载默认的nginx.conf文件)
./nginx
2.指定要加载的配置文件
./nginx -c [配置文件路径]
3.指定master进程pid保存到的文件
#注意分号一定要带
./nginx -g "pid [pid文件路径];"
停止命令
1.通过发送信号量停止
语法:kill [信号量类型] [进程编号]
①从容停止:kill -quit [master进程编号]
;允许Nginx将当前正在处理的网络请求处理完,但不再接受新的请求。
②快速停止:kill -term [master进程编号]
;立即停止当前正在处理的所有网络请求。
③强制停止:kill -9 [进程编号]
;需要分别停止master和worker进程。
2.通过./nginx命令停止
./nginx -s stop
重新加载
如果修改了conf文件,在重新加载之前,需要验证配置文件是否存在语法问题:./nginx -t
;
1.通过nginx命令重新加载
./nginx -s reload
2.如果是通过启动命令3启动的
./nginx -g "pid [pid文件];" -s reload
3.通过信号量
kill -hup [master进程编号]
配置文件nginx.conf简析
nginx.conf文件组成:
|-main:配置进程、权限及错误日志等信息
|-events:配置IO模型,如epoll、kquque、select等
|-http:控制nginx中的http进程
|-邮件模块
|-第三方模块
1.main模块
#设置worker进程归属 用户 用户组
#user nobody;
#设置worker进程数 根据服务器硬件(cpu核数)来设置
#一般为cpu总核数或总核数的两倍
worker_processes 1;
#错误日志保存位置及日志级别
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#master进程pid保存位置
#pid logs/nginx.pid;
2.events模块
events {
#一个worker进程能处理的连接数
worker_connections 1024;
#accept_mutex on;
#多个Worker将以串行方式来处理,当请求到来时,其中有一个Worker会被唤醒,
#其他的Worker继续保持休眠状态防止多个线程连接的争抢,解决”惊群“问题,
#但同时也会造成worker压力不均的问题。况且,nginx的worker_process数量并不多,所以建议关闭
#是否允许同时接收多个网络连接
multi_accept on;
#设置io模型,以哪种事件驱动处理网络请求
use epoll;
}
3.http模块
http {
#请求头配置 在'mime.type'文件中找不到'文件'映射的'type'时'采用'默认的'default_type'
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#sendfile 替换read()和write()调用,减少系统上下文切换从而提高性能,
#当 nginx 是静态文件服务器时,能极大提高nginx的性能表现
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#每个server对应一个服务
server {
#端口号
listen 80;
#服务名
server_name localhost;
#charset koi8-r;
#虚拟主机对应的资源路径
#root [路径];
#access_log logs/host.access.log main;
#代理规则 location /uri表达式
location / {
#文件路径
root html;
#文件名
index index.html index.htm;
}
#
#错误号对应的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location匹配规则
location会尝试根据用户请求中的URI来匹配/uri表达式,如果可以匹配,就会选择location{}块中的配置来处理用户请求。其匹配方式分为以下主要几种:
正则匹配:① ~ 表示执行一个正则匹配,区分大小写
② ~* 执行一个正则匹配,不区分大小写。
普通匹配:①= 进行普通字符精确匹配
② 什么都不加的普通匹配
示例
location /demo {#普通匹配
root html;
index index.html;
}
location =/demo{#精准匹配
root html;
index index1.html;
}
location ~* \.(gif|css|js|jpg|png)${//正则匹配
root html/images;
}
匹配的优先级
1)精确匹配优先级最高,当命中规则时停止匹配并返回结果
2)其次执行普通匹配,记录最长的命中结果,但不返回。
3)执行正则匹配,按照顺序进行判断,如果命中则立即返回结果,如果没有,就返回普通匹配的命中结果
location 代理规则
当我们发送一个http:[nginxIp]:[nginxPort]/proxy/index.html
到Nginx时,
如果配置为
location /proxy/{
proxy_pass http://[realIp]:[realPort]/;
}
请求会被代理到htttp://[realIp]:[realProt]/index.html
;
配置情况2:
location /proxy/{
proxy_pass http://[realIp]:[realPort];
}
请求会被代理到htttp://[realIp]:[realProt]/proxy/index.html
;
配置情况3
location /proxy/{
proxy_pass http://[realIp]:[realPort]/[realUri]/;
}
请求会被代理到htttp://[realIp]:[realProt]/[realUri]/index.html
;
配置情况4
location /proxy/{
proxy_pass http://[realIp]:[realPort]/[realUri];
}
请求会被代理到htttp://[realIp]:[realProt]/[realUri]index.html
;
因此,我们可以得出结论:当proxy_pass配置的url结尾带’/'时,proxy
会被替换为设置的contextPath
,然后追加后面的内容;如果不带‘/’,且结束的最后一个值时端口号时,/proxy/index.html直接被追加,如果是contextPath,则直接拼接/index.html。
其次,也可以通过rewrite regex replacement [flag];
进行进一步设置。
rewrite结合正则表达式和标志位实现url重写以及重定向,只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
1.执行server块的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
flag标志位
last : 相当于Apache的[L]标记,表示完成rewrite
break : 停止执行当前虚拟主机的后续rewrite指令集
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令
示例:请求为http://127.0.0.1:80/proxy/real/inex
location /proxy/{
proxy_pass http:///ip:port
rewrite ^/proxy/(.*)$ /$1 break;
}
会被转发到http://ip:port/real/index
。$1
指规则中第一个匹配组的值。