安装
代码语言: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