常用命令
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 #从容关闭工作进程
负载均衡合反向代理
负载均衡方式
- 手动负载均衡:比如一些下载网站,视频网站,选择下载服务器和路线
- DNS轮询方式:给一个域名配置多个A记录ip,请求被随机打到后面的一个ip上面,缺点故障恢复时间周期长,因为各运营商将DNS放入缓存中,全部生效要几小时,期间所有访问这台服务都会报错;不能分配负载占比
- 四/七层负载均衡设备:硬件有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拥有以下变量:
- $upstream_addr
- $upstream_status
- $upstream_response_time
- 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既不会继承也不会影响其他部分