Nginx 深入浅出

常用命令

Nginx启动会创建多个进程,其中一个是master进程,另外的是worker进程

nginx -h
nginx [-c /etc/nginx/nginx.conf] 指定配置文件路径 #启动

##############停止#########
nginx -s stop
nginx -s quit
kill -QUIT pid 从容停止
kill -TERM pid 快速停止
kill -9 pid 强制停止

#########重启##########
nginx -s reload
nginx -s reopen
kill -HUP pid

#########重启##########
kill -USR1 pid #日志文件拆分
kill -USR2 pid #平滑升级nginx版本
kill -WINCH pid #从容关闭工作进程

负载均衡合反向代理

负载均衡方式

  1. 手动负载均衡:比如一些下载网站,视频网站,选择下载服务器和路线
  2. DNS轮询方式:给一个域名配置多个A记录ip,请求被随机打到后面的一个ip上面,缺点故障恢复时间周期长,因为各运营商将DNS放入缓存中,全部生效要几小时,期间所有访问这台服务都会报错;不能分配负载占比
  3. 四/七层负载均衡设备:硬件有F5,软件有四层LVS,七层Nginx、Haproxy,Nginx只支持http、邮件协议

Nginx反向代理配置示例

http {
	inc1ude mime.types;
	defau1t_type app1ication/octet-stream;

	upstream php_server_pool {
	    ip_hash; #默认轮询,这里采用ip hash的路由方式
	    #可以是域名、ip、端口
		server 192.168.1.10:80 weight=4 max_fails=2 fail_timeout=30s; 
		#backup只有在非backup全部宕机才启用
		server 192.168.1.11:80 weight=4 max_fails=2 fail_timeout=30s backup; 
		server 192.168.1.12:80 weight=2 max_fails=2 fail_timeout=30s down;
	}

	#虚拟主机,反向代理php_server_pool
	server {
		listen 80;
		server_name www.yourdomain.com;
		location / {
			#如果后端报错,则自动路由到下一个节点
			proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy二pass http://php_server_pool;
			proxy_set_header Host www.yourdomain.com;
			proxy_set_header X-Forwarded-For $remote_addr;
		}
	}
	access_log /data1/1ogs/www.yourdomain.com_access.log; 
}

upstream拥有以下变量:

  1. $upstream_addr
  2. $upstream_status
  3. $upstream_response_time
  4. KaTeX parse error: Expected group after '_' at position 14: upstream_http_̲HEADER

Nginx双机高可用

原理:通过虚拟IP(也称浮动ip)实现,用keepalived实现ip的迁移

实现方式:

  • 方式1:只用一个公网虚拟ip,平时指向主Nginx,如果主挂掉,备Nginx接管这个虚拟ip
  • 方式2:用两个公网虚拟ip,如果其中一个Nginx挂掉,接管挂掉的Nginx的ip

Nginx rewrite重定向

相关指令有if、 rewrite、 set、 return、 break

if

  • 语法:if (condition) {}
  • 作用域:server、location
  • 不支持嵌套,不支持&&、||连接多个条件
  • 条件可以为变量
  • =和!=
  • ~ 表示区分大小写
  • ~* 表示不区分大小写
  • -f !-f 表示文件是否存在
  • -d !-d 表示目录是否存在
  • -e !-e 表示文件或者目录是否存在
  • -x !-x 表示文件是否可执行
if ($http_user_agent - MSIE) { 
    rewrite ^ (. *) $ /msie/$1 break;
}
if ($http_cookie -* "id=([^;] +)(?:;I$)" ) { 
    set $id $1;
}
if ($request_method POST) { 
    return 405;
}

return

结束并返回状态码给客户端

  • 语法:return code
  • 作用域:server、location、if
location ~ .*\.(sh|bash)?$ {
    return 403;
}

rewrite

重定向uri

  • 语法:rewrite regex replacement flag
  • 作用域:server、location、if

flag说明

  • last一一相当于 Apache 里的 [L]标记,表示完成 rewrite;
  • break一一本条规则匹配完成后,终止匹配,不再匹配后面的规则
  • redirect一一返回302临时重定向,浏览器地址栏会显示跳转后的 URL地址
  • permanent一一返回到301永久重定向,浏览器地址栏会显示跳转后的 URL 地址。

set

  • 语法:set varName value
  • 作用域:server、location、if
    值可以是文本、变量、文本变量组合

在if、location、rewrite可以使用的全局变量

  • $args
  • $content_length
  • $content_type
  • $document_root
  • $documenc_uri
  • $host
  • $http_user_agent
  • $http_cookie
  • $limit_rate
  • $request_body_file
  • $request_method
  • $remote_addr
  • $remote_port
  • $remote_user
  • $requesc_filename
  • $requesc_uri
  • $query_string
  • $scheme
  • $server_protocol
  • $server_addr
  • $server_name
  • $server_port
  • $uri

禁止访问以 /data 开头的文件:

location ~ ^/data { 
    deny all;
}

设置浏览器缓存时间

location ~ .*(gif|png|jpg|jpeg|) {
    expired 1d;
}
location ~ .*(js|css) {
    expired 1h;
}

多目录转成参数 abc.domian.comlsort/2=> abc.domian.com/index.php?act=sort&name=abc&id=2:

if ($host -* (. *)\.domain\.com) {
    set $sub_name $1;
    rewrite ^/sort\/ (\d+)\/?$ /index.php?act=sort&cid=$sub_narne&id=$1 last:
}

Nginx模块开发

  • 主要模块:main(全局配置)、server(虚拟主机配置)、upstream(反向代理、负载均衡配置)、location(目录匹配配置)
  • location继承server的指令,server继承main的指令,upstream既不会继承也不会影响其他部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值