nginx笔记

安装
brew install nginx
#linux安装
yum install nginx
基本参数使用
安装路径
rpm -ql nginx #查看安装路径
nginx -t -c nginx.conf #检查配置文件
nginx -s reload -c nginx.conf #使配置文件生效
/etc/logrotate.d/nginx nginx日志轮转,用于logrotate服务的日志切割
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf nginx 配置文件
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params cgi配置
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/win-utf 编码转换映射转化文件
/etc/nginx/mime.types 设置http协议的Content-Type 与扩展名对应关系
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service 配置系统守护进程管理器管理方式
/etc/nginx/modules
/usr/lib64/nginx/modules 模块目录
/usr/sbin/nginx
/usr/sbin/nginx-debug 启动管理终端命令
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz 手册和帮助文件
/var/cache/nginx 开启缓存后的缓存目录
/var/log/nginx 日志目录
编译参数
nginx -V
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock 安装路径
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 执行对应模块时,nginx所保留的临时性文件
--user=nginx
--group=nginx 设定nginx进程启动的用户和用户组
--with-cc-opt gcc编译的额外参数
--with-ld-opt 设置附加参数,链接系统库
配置
默认配置
#设置nginx服务的系统使用用户
#如果希望所有用户都可以启动Nginx进程,有两种办法:一是将此指令行注释掉;一种是设置为nobody
#user nobody nobody
user nginx;
#工作进程数,从理论上来说,worker process的值越大,可以支持的并发处理量也越多
# worker_processes number | auto(自动检测)
worker_processes 1;
#错误日志
#error_log file | stderr [debug | info | notice |warn| error|crit| alert | emerg];
error_log /var/log/nginx/error.log warn;
#服务启动时pid
pid /var/run/nginx.pid;
events {
#在《UNIX网络编程》第1卷里提到过一个叫“惊群”的问题(Thundering herd problem),大致意思是,当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。为了解决这样的问题,Nginx配置中包含了这样一条指令accept_mutex,当其设置为开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
accept mutex on | off;
#每个Nginx服务器的worker process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置
multi_accept on | off;
#Nginx服务器提供了多种事件驱动模型来处理网络消息其中,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport
use method;
#每个进程允许的最大连接数
worker_connections 1024;
}
#http模块
location /img/ {
alias /var/www/image/;
}
#若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ {
root /var/www/image;
}
#若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。
alias是一个目录别名的定义,root则是最上层目录的定义。
一直以为root是指的/var/www/image目录下,应该 是 /var/www/image/img/
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无
可以是绝对目录,也可以是相对目录(相对于nginx的安装目录)
uri解析
= 精确匹配,如果已经匹配成功,就停止继续向下搜索并立即处理此请求
^~ 匹配以某个uri开头的请求,不支持正则表达式
#如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。
~ 用于表示uri包含正则表达式,并且区分大小写。
~* 用于表示uri包含正则表达式,并且不区分大小写。
nginx变量
1.http请求变量
arg_PARAMETER #请求参数
http_HEADER #请求头
sent_http_HEADER #响应头
2.内置变量
3.自定义变量
nginx模块
nginx官方模块
http_stub_status_module nginx的客户端状态
http_random_index_module 目录中随机选择一个主页
http_sub_module http内容替换
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
http_access_module 基于ip的访问控制
局限性:如果中间有代理的话,使用$remote_addr 就会不准确
方法:
- 采用别的http头信息控制,如HTTP_X_FORWARD_FOR
- 结合geo模块
- 通过http自定义变量传递
http_auth_basic_module 基于用户的信任登录
局限:
- 用户信息依赖文件方式
- 操作管理机械,效率低下
解决方案:
- 结合lua
- Nginx和ldap打通,利用nginx-auth-ldap模块
nginx第三方模块
nginx静态服务器
文件读取:sendfile
tcp_nopush sendfile 开启的情况下,提高网络包的传输效率
tcp_nodelay keepalive下,提高网络包的传输实时性
gzip 压缩
gzip_comp_level 压缩比
http_gzip_static_module 扩展压缩模块,预读gzip功能
跨域访问:Access-Control-Allow-
防盗链:http_referer
valid_referers none blocked 116.62.103.228
if($valid_referers){
return 403
}
代理服务
代理区别:代理的对象不一样
正向代理代理的对象是客户端
resolver 8.8.8.8 location / { proxy_pass http://$http_host$request_uri }
反向代理代理的对象是服务端
proxy_pass http(https)://hostname:port/app #在使用该指令的过程中还要注意,URL中是否包含有URI,Nginx服务器的处理方式是不同的。如果URL中不包含URI,Nginx服务器不会改变原地址的URI;但是如果包含了URI,Nginx服务器将会使用新的URI替代原来的URI。我们举例来说明。例子如下 server{ listen 80; server name www.myweb. name; location /server/ { proxy_pass http://192.168.1.1; } # 如果客户端使用“http://www.myweb.name/server”发起请求,该请求被配置中显示的location块进行处理,由于proxy_pass指令的URL变量不含有URI,所以转向的地址为“http://192.168.1.1/server” server{ listen 80; server name www.myweb. name; location /server/ { proxy_pass http://192.168.1.1/loc/; } #在该配置实例中,proxy_pass指令的URL包含了URI“/loc/”。如果客户端仍然使用“http://www. myweb.name/server/”发起请求,Nginx服务器将会把地址转向“http://192.168.1.1/loc/” #通过上面的实例,我们可以总结出,在使用proxy_pass指令时,如果不想改变原地址中的URI,就不要在URL变量中配置URI #明白了上面这两个例子的用法,我们来解释大家经常讨论的一个问题,就是proxy_pass指令的URL变量末尾是否加斜杠“/”的问题。 #配置1: proxy_pass http://192.168.1.1; #配置2: proxy_pass http://192.168.1.1/; #配置1和配置2的区别在于,配置2中proxy_pass指令的URL变量末尾添加了斜杠“/”,这意味着配置2中proxy_pass指令的URL变量包含了URI “/”,而配置1中proxy_pass指令的URL变量不包含URI。理解了这一点,我们就可以解释下面的实例和现象了。大家注意各例子之间的对比。 server { listen 80; server name www.myweb. name; location / #注意location的uri变量 { #配置1: proxy_pass http://192.168.1.1; #配置2: proxy_pass http://192.168.1.1/; } #在该配置中,location块使用“/”作为uri变量的值来匹配不包含URI的请求URL。由于请求URL中不包含URI,因此配置1和配置2的效果是一样的。比如,客户端的请求URL为“http://www.myweb.name/index.htm”,其将会被实例1中的location块匹配成功并进行处理。不管使用配置1还是配置2,转向的URL都为:“http://192.168.1.1/index.htm” server { listen 80; server name www.myweb. name; location /server/ #注意location的uri变量 { #配置1: proxy_pass http://192.168.1.1; #配置2: proxy_pass http://192.168.1.1/; } #在该配置中,location块使用“/server/”作为uri变量的值来匹配包含URI “/server/”的请求URL。这时,使用配置1和配置2的转向结果就不相同了。使用配置1的时候,proxy_pass指令中的URL变量不包含URI,Nginx服务器将不改变原地址的URI;使用配置2的时候,proxy_pass指令中的URL变量包含URI “/”,Nginx服务器会将原地址的URI替换为“/”。 #比如,客户端的请求URL为“http://www.myweb.name/server/index.htm”,将会被实例2中的location块匹配成功并进行处理。使用配置1的时候,转向的URL为“http://192.168.1.1/server/index.htm”,原地址的URI “/server/”未被改变;但使用配置2时,转向的URL为“http://192.168.1.1/index.htm”,可以看到,原地址的URI “/server/”被替换为“/”。
补充:
proxy_buffering #缓冲区 proxy_redirect #跳转重定向 proxy_set_header field value #设置请求头 proxy_connect_timeout time #连接超时时间 proxy_read_timeout #读超时 proxy_send_timeout #发送给客户端超时
负载均衡
upstream name{
server http://ip:port/app server状态
}
#server 状态
down #当前的server暂时不参与负载均衡
backup #预留的备份服务器
max_fails #允许请求失败的次数
fail_timeout #经过max_fails 失败后,服务暂停的时间
max_conns #限制最大接收的连接数
#调度算法
轮询:按时间顺序逐一分配到不同的后端服务器
加权轮询:weight值越大,分配到的访问几率越高
ip_hash: 每个请求按访问ip的hash结果分配,这样来自同一个ip的固定访问一个后端服务器
url_hash: 按照访问的url的hash结果来分配请求,每个url定向到同一个后端服务器 hash $request_uri
least_conn:最少连接数,那个机器连接数少就分发
hash关键数值: hash自定义的key
缓存服务
proxy_cache_path #缓存路径
levels=1:2
keys_zone=缓存名称:缓存大小
max_size=10g #缓存最大空间
inactive=60m #如果60分钟未使用,则会淘汰
use_temp_path=off #临时目录(建议关闭)
动静分离
rewrite
rewrite regex replacement [flag] flag: last #停止rewirte监测 (进入location后会重新请求一次) break #停止rewirte监测 (进入location后不会出来) redirect #返回302临时重定向,地址栏会显示跳转后的地址 permanent #返回301永久重定向,地址栏会显示跳转后的地址 (只发送一次请求,浏览器会记住重定向的地址,以后的请求不会再请求后端服务) 优先级: server>location
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 haominglfs的博客!