安装

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官方模块
  1. http_stub_status_module nginx的客户端状态

  2. http_random_index_module 目录中随机选择一个主页

  3. http_sub_module http内容替换

  4. limit_conn_module 连接频率限制

  5. limit_req_module 请求频率限制

  6. http_access_module 基于ip的访问控制

    局限性:如果中间有代理的话,使用$remote_addr 就会不准确

    方法:

    • 采用别的http头信息控制,如HTTP_X_FORWARD_FOR
    • 结合geo模块
    • 通过http自定义变量传递
  7. 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
}

代理服务

代理区别:代理的对象不一样

  1. 正向代理代理的对象是客户端

    resolver 8.8.8.8
    location / {
    	proxy_pass http://$http_host$request_uri
    }
  2. 反向代理代理的对象是服务端

    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/”被替换为“/”。
  3. 补充:

    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 #临时目录(建议关闭)

动静分离

  1. rewrite

    rewrite regex replacement [flag]
    flag:
    	last #停止rewirte监测    (进入location后会重新请求一次)
    	break #停止rewirte监测  (进入location后不会出来)
    	redirect #返回302临时重定向,地址栏会显示跳转后的地址
    	permanent #返回301永久重定向,地址栏会显示跳转后的地址  (只发送一次请求,浏览器会记住重定向的地址,以后的请求不会再请求后端服务)
    	
    优先级:
    	server>location