Nginx常用操作总结

2022-10-27 14:46:13 浏览数 (1)

安装

代码语言:javascript复制
--prefix=PATH			# nginx的安装目录,默认值为/usr/local/nginx
--sbin-path=PATH		# 程序文件(nginx)的路径,默认值为<prefix>/sbin/nginx
--modules-path=PATH		# nginx动态模块安装目录,默认值为<prefix>/modules
--conf-path=PATH		# 配置文件(nginx.conf)的路径,默认值为<prefix>/conf/nginx.conf
--error-log-path=PATH		# 错误日志文件的路径,默认值为<prefix>/logs/error.log
--http-log-path=PATH		# 访问日志文件的路径,默认值为<prefix>/logs/access.log
--pid-path=PATH			# Nginx启动后的pid文件路径,默认值为<prefix>/logs/nginx.pid
--lock-path=PATH		# Nginx锁文件的存储路径,默认值为<prefix>/logs/nginx.lock

配置

代码语言:javascript复制
keepalive_timeout timeout		# 设定keepalived连接的超时时长,0表示禁止长连接
keepalive_requests number		# 在keepalived连接上所允许的最大资源数量,默认100
keepalive_disable							# 指明禁止为何种浏览器使用keepalive功能
send_timeout number							# 发送响应报文的超时时长,默认60s
client_body_buffer_size size		# 接收客户请求报文body的缓冲区大小,默认16k,超出此指定大小时,将被移存到磁盘上
client_body_temp_path			# 设定用于存储客户端请求body的临时存储路径及子目录结构 和数量
open_file_cache off;
open_file_cache max=N [inactive=time]
	nginx可以缓存以下三种信息:
		1、文件描述符、文件大小和最近一次的修改时间
		2、打开的目录的结构
		3、没有找到的或没有权限操作的文件的相关信息
	max=N		# 可以缓存的最大条目上限,一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项
	inactive=time	# 指定的时长内没有被访问过的缓存项视为非活动缓存项,直接删除
open_file_cache_errors on|off		# 是否缓存找不到其路径的文件,或没有权限访问的文件相关信息
open_file_cache_valid time		# 每隔多久检查一次缓存中缓存项的有效性,默认60s
open_file_cache_min_uses number		# 缓存项在非活动期限内最少应该被访问的次数

常用功能

代理
代码语言:javascript复制
=			# 精确匹配
~			# 正则匹配,区分大小写
~*			# 正则匹配,不区分大小写
^~			# URI的左半部分匹配,不区分大小写
优先级:= -> ^~ -> ~或~* -> /

# 访问http://domain/forum时,重定向到http://192.168.1.11:8080/bbs
location /forum {
	proxy_pass http://192.168.1.11:8080/bbs;	# 不带模式匹配时,转发的目录后面是否带/,要跟上面的location后面的一致
}

# 模式匹配时,访问http://domain/forum时,重定向到http://192.168.1.11:8080/forum
location ~* ^/forum {
	proxy_pass http://192.168.1.11:8080;		# 模式匹配时,后面不允许带目录
}



# proxy_pass 后面带与不带"/"的区别

# http://ip/abc/index -> http://192.168.1.100:8080/abc/index
# 即nginx会把匹配到的内容都追加到proxy_pass地址后面
location /abc {
	proxy_pass http://192.168.1.100:8080;
}

# http://ip/abc/index -> http://192.168.1.100:8080//index
# nginx不会把匹配到的内容追加到proxy_pass地址后面
location /abc {
	proxy_pass http://192.168.1.100:8080/;
}

# http://ip/abc/index -> http://192.168.1.100:8080/abc/index
location /abc/ {
    proxy_pass http://192.168.1.100:8080;
}

# http://ip/abc/index -> http://192.168.1.100:8080/index
location /abc/ {
    proxy_pass http://192.168.1.100:8080/;
}

# http://ip/abc/index -> http://192.168.1.100:8080/defindex
location /abc/ {
    proxy_pass http://192.168.1.100:8080/def;
}

# http://ip/abc/index -> http://192.168.1.100:8080/def/index
location /abc/ {
    proxy_pass http://192.168.1.100:8080/def/;
}

# http://ip/abc/index -> http://192.168.1.100:8080/def/index
location /abc {
    proxy_pass http://192.168.1.100:8080/def;
}

# http://ip/abc/index -> http://192.168.1.100:8080/def//index
location /abc {
    proxy_pass http://192.168.1.100:8080/def/;
}
缓存
代码语言:javascript复制
http {
    ......
    proxy_cache_path /nginx/cache levels=1:2:1 keys_zone=cache:100m max_size=1g;
    	# levels:定义缓存目录级别,如1级目录1个字符,2级目录2个字符,3级目录1个字符;
    	# keys_zone:命名共享内存空间,区域大小;
    	# max_size:缓存目录大小;
    ......
    
    server {
    	listen	80;
    	server_name www.xxx.com;
    	
        add_header X-Via $server_addr;			# 通过谁来
        add_header X-Cache $upstream_cache_status;	# 是否命中缓存
        add_header X-Cache "$upstream_cache_status from $server_addr";
        ......
        
        proxy_cache cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }
}
if指令
代码语言:javascript复制
# -f和!-f:判断是否存在文件
# -d和!-d:判断是否存在目录
# -e和!-e:判断是否存在文件或目录
# -x和!-x:判断文件是否可执行

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;	# 如果UA包含"MSIE",rewrite请求到/msid/目录下
}

if ($http_cookie ~* "id=([^;] )(?:;|$)") {
    set $id $1;									# 如果cookie匹配正则,设置变量$id等于正则引用部分
 }

if ($request_method = POST) {
    return 405;				# 如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
}

if ($slow) {
    limit_rate 10k;			# 限速,$slow可以通过 set 指令设置
}

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1; 	# 如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
}

if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;		# 如果query string中包含"post=140",永久重定向到example.com
}

location ~* .(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.leizhenfang.com;
    if ($invalid_referer) {		# 防盗链
        return 404;
    }
}
rewrite指令
代码语言:javascript复制
rewrite 正则表达式 替代内容 [flag标记]

flag标记说明:
last:本条规则匹配完成后,继续向下匹配新的location URI规则;
break:本条规则匹配完成即终止,不再匹配后面的任何规则;
redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址;
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
正则表达式
代码语言:javascript复制
server_name中可以使用正则表达式,并且使用~作为正则表达式字符串的开始标记

配置案例:
server {
    listen	80;
    server_name ~^www.(w ).com$;		# ~后面不能有空格
    default_type text/plain;
} 
变量
代码语言:javascript复制
vim conf/nginx.conf

location = /variable {
      add_header  Content-Type 'text/html; charset=utf-8';
      return 200 "
        args = $args<br />
        binary_remote_addr = $binary_remote_addr<br />
        body_bytes_sent = $body_bytes_sent<br />
        content_length = $content_length<br />
        content_type= $content_type<br />
        document_root = $document_root<br />
        document_uri = $document_uri<br />
        host = $host<br />
        hostname   = $hostname<br />
        http_user_agent = $http_user_agent<br />
        is_args = $is_args<br />
        limit_rate  = $limit_rate<br />
        nginx_version  = $nginx_version<br />
        query_string  = $query_string<br />
        remote_addr  = $remote_addr<br />
        remote_port  = $remote_port<br />
        request_filename = $request_filename<br />
        request_body  = $request_body<br />
        request_body_file  = $request_body_file<br />
        request_completion  = $request_completion<br />
        request_method  = $request_method<br />
        request_uri  = $request_uri<br />
        scheme  = $scheme<br />
        server_addr  = $server_addr<br />
        server_name  = $server_name<br />
        server_port  = $server_port<br />
        server_protocol  = $server_protocol<br />";
}

# 访问 http://192.168.1.64/variable?a=123
args = a=123
binary_remote_addr = ���
body_bytes_sent = 0
content_length =
content_type=
document_root = /etc/nginx/html
document_uri = /variable
host = 192.168.1.64			# nginx服务器IP
hostname = nginx			# nginx服务器主机名
http_user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
is_args = ?
limit_rate = 0
nginx_version 	= 1.18.0		# nginx版本
query_string = a=123
remote_addr = 192.168.1.243		# 客户端IP
remote_port = 54602
request_filename = /etc/nginx/html/variable
request_body =
request_body_file =
request_completion =
request_method = GET
request_uri = /variable?a=123
scheme = http
server_addr = 192.168.1.64
server_name = localhost			# nginx配置中的server_name
server_port = 80
server_protocol = HTTP/1.1

常用模块

ngx_http_auth_basic_module
代码语言:javascript复制
ngx_http_auth_basic_module 		# basic认证
	auth_basic string | off;	# 使用http基本认证协议对用户进行认证
	auth_basic_user_file file	# 实现用户认证的账号文件
		htpasswd -c -m /etc/nginx/htpasswd admin
		htpasswd -m /etc/nginx/htpasswd test
			-c		# 创建用户,每次创建用户的时候使用
			-m		# 使用md5加密
ngx_http_stub_status_module
代码语言:javascript复制
ngx_http_stub_status_module
	stub_status		# 输出stub_status
	
	Active connections	# 当前活动的客户端连接数
	accepts			# 已经接受的客户端连接问题
	handled			# 已经处理过后客户端连接问题
	requests		# 客户端的总的请求数量
	Readking		# 正在读取的客户端请求的数量
	Writing			# 正向其发送响应报文的连接数量
	Waiting:		# 等待其发出请求的空闲连接数量
ngx_http_referer_module
代码语言:javascript复制
ngx_http_referer_module
	valid_referers none|blocked|server_names|string...
		none			# 请求报文不存在referer首部
		blocked			# 请求报文中存在referer首部,但其没有有效值,或其值非以http://或https://开头
		server_names		# 其值为一个主机名
ngx_http_proxy_module
代码语言:javascript复制
ngx_http_proxy_module
	proxy_set_header Host $host			# upstream有多个主机时,需要加该选项
	proxy_set_header   X-Real-IP $remote_addr	# 获取客户端真实IP

0 人点赞