Nginx学习笔记

Nginx安装

# 安装各种依赖
yum -y install autoconf automake make
yum -y install gcc gcc-c++

yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel

# 源码安装
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -zxvf nginx-1.15.8.tar.gz
cd nginx-1.15.8
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 
make && make install
export PATH=$PATH:/usr/local/nginx/sbin/

# yum安装
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty

# 安装echo插件
# 注:安装插件需要关停Nginx服务后安装才会生效
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar -zxvf v0.61.tar.gz
cd nginx-1.15.8 ##进入 nginx 源码目录,准备重新配置 nginx
./configure --add-module=/usr/local/src/echo-nginx-module-0.61/
make && make install

# 源码方式安装的Nginx卸载,直接删除安装目录的文件夹即可
rm -rf /usr/local/nginx

# 安装OpenResty
wget https://openresty.org/download/openresty-1.15.8.1.tar.gz 
tar -zxvf openresty-1.15.8.1.tar.gz 
##选择需要的插件启用, --with-Components 激活组件,--without 则是禁止组件 
./configure --without-http_redis2_module --with-http_iconv_module make && make install 
##加入 path 路径
vi /etc/profile 
export PATH=$PATH:/usr/local/openresty/nginx/sbin/
##生效配置
source /etc/profile

Nginx常用命令

./nginx -c nginx.conf 的文件。如果不指定,默认为 NGINX_HOME/conf/nginx.conf 
./nginx -s stop 停止 
./nginx -s quit 退出 
./nginx -s reload 重新加载 nginx.conf
./nginx -h 查看帮助文档

Nginx日志管理

1.日志格式参数

参数名含义
$remote_addr客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user用于记录远程客户端的用户名称(一般为“-”)
$time_local用于记录访问时间和时区
$request用于记录请求的url以及请求方法
$status响应状态码,例如:200成功、404页面找不到等
$body_bytes_sent给客户端发送的文件主体内容字节数
$http_user_agent用户所使用的代理(一般为浏览器)
$http_x_forwarded_for可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer可以记录用户是从哪个链接访问过来的
  • 错误日志不能自定义格式

2.按日期切割日志

  1. 设置Linux系统定时器

    crontab -e #编辑定时器
    0 0 * * * root /usr/local/nginx/logs/ngx_log.sh
    crontab -l #使定时器生效
    # 可能会出现以下情况
    You have new mail in /var/spool/mail/root #系统提示
    cat /var/spool/mail/root #查看提示
    /bin/sh: root: command not found #出现报错,此时删除cron表达式中的root即可
    
  2. 准备shell脚本

    #!/bin/bash
    #设置日志文件存放目录
    LOGS_PATH=/usr/local/nginx/logs
    #备分文件名称
    YESTERDAY=$(date -d "yesterday" +%Y%m%d%H%M)
    #重命名日志文件
    mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
    mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
    ## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
    kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
    
  3. 修改shell脚本为可执行文件

    chmod 774 ngx_log.sh
    

Nginx虚拟主机

Nginx在server中使用域名+端口来确定一个虚拟主机,并可以设置其中一个server为默认的虚拟主机

server {
		# 默认虚拟主机是当客户端通过IP地址或进行访问的时候生效
        listen       80 default_server;
        server_name  xx.com;

        location / {
            root   /usr/local/nginx/html;
            index  b.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

匹配规则

server_name指令可以定义为精准匹配、通配符、正则表达式。

  1. 当通过名称匹配到多个虚拟主机后,按以下优先级顺序选择
    1. 精准匹配
    2. 以*号开头最长的通配符名称
    3. 以*号结束最长的通配符名称
    4. 第一个匹配到的正则名称(以配置文件中出现的顺序)
  2. 通配符名称中的*号只能在名称的开始或结尾,并且只能在.号外,例如,“www.*.example.org”和“w*.example.org”都是无效的通配符名称,但是以上名称可以通过正则表达式来表示。

    特殊的通配符名称:“.example.org”既可以精准匹配“example.com”,也可以匹配通配符名称“*.example.org”

  3. 正则表达式,使用PCRE

官方文档地址:http://nginx.org/en/docs/http/server_names.html

Nginx路由location

1.语法规则

符号含义
=表示精确匹配
^~表示url以某个常规字符串开头(禁止正则匹配)
~表示区分大小写的正则匹配
~*表示不区分大小写的正则匹配
!和!*分别表示区分大小写不匹配及不区分大小写不匹配的正则
/用户所使用的代理(一般为浏览器)

2.匹配规则

Created with Raphaël 2.2.0 Start 精准匹配 返回精准匹配的location End 一般匹配 最长的匹配结果是否声明为非正则 返回声明为非正则location End 正则匹配 返回命中的第一个正则location End yes no yes no yes no yes
  1. 精准匹配命中时,停止location动作,直接走精准匹配
  2. 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
  3. 如果最长的那一条普通匹配声明为非正则,直接走此条匹配,停止location
  4. 如果最长的那一条普通匹配不是非正则,继续往下走正则location
  5. 按代码顺序执行正则匹配,当第一条正则location命中时,停止location

3.执行过程

url=域名+端口+path+param

  1. 域名+端口 ===>定位虚拟主机
  2. path与location部分匹配,path=匹配path1+剩余path2
  3. root:在目录里找path1+path2路径,【静态服务器】
  4. alias:在目录里找path2路径;若url以/结尾,认为是目录,执行该目录下的index.html文件;否则认为path路径到达指定文件
  5. proxy_pass;当ip:port/时,转发ip+port+path2;当ip:port时,转发ip+port+path1+path2

4.rewrite使用

rewrite regex replacement [flag]

  • flag=【break/last/redirect/permanent】

  • regex是正则表达式

  • replacement是替换值

  • flag是后续处理标识

    • break-内部重定向,path值被更新,rewrite层面的命令中断。原控制流程逻辑不变往下走
    • last-内部重定向,path值被更新,rewrite层面的命令中断。控制流程刷新,重新进行整个location匹配
    • redirect/permanent-外部重定向(301永久重定向/302临时重定向),Nginx流程结束,返回http响应到浏览器,页面url更新
    • flag为空-内部重定向,path值更新,rewrite层命令继续,到最后一个rewrite完毕,刷新控制流程,重新进行location匹配
  • index关键字原理:当请求的文件在目录下存在时,会重新触发location,如果匹配到对应的location,则执行location,否则返回index后的文件

    location /aa.html {
        rewrite ^/  /a.html break;##停止指令,流程不变往下走		
        rewrite ^/  /b.html break;	
        root   /etc/nginx/html/;
    }
    

Nginx负载均衡

  • 关键字:upstream

  • 负载策略:

    • ip_hash

      # 根据客户端访问的IP进行哈希值计算后,将访问固定到某一个server
      upstream ${upstream_name} { 
          ip_hash; 
          server ip1:port1; 
          server ip2:port2; 
      }
      
    • 轮询

      upstream ${upstream_name} { 
          server ip1:port1; 
          server ip2:port2; 
      }
      
    • 权重

      upstream ${upstream_name} { 
          server ip1:port1 weight=1; 
          server ip2:port2 weight=2; 
      }
      
  • 在server后配置down可以标识server下线

    upstream ${upstream_name} { 
        server ip1:port1 weight=1 down; 
        server ip2:port2 weight=2; 
    }
    

跨域

#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin  http://a.com;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
#P3P支持跨域cookie操作
add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
#OPTIONS类的请求,是跨域先验请求
if ($request_method = 'OPTIONS') {
	#204代表ok
	return 204;
}

防盗链

# https://nginx.org/en/docs/http/ngx_http_referer_module.html

# Syntax:	valid_referers none | blocked | server_names | string ...;
# Default:	—
# Context:	server, location

valid_referers *.com; # 对referer进行校验

压缩gzip

# https://nginx.org/en/docs/http/ngx_http_gzip_module.html

# Syntax:	gzip on | off;
# Default:	gzip off;
# Context:	http, server, location, if in location

gzip on; # 启用gzip压缩,默认是off,不启用
# 对js、css、jpg、png、gif格式的文件启用gzip压缩功能
gzip_types application/javascript text/css image/jpeg image/png image/gif;
gzip_min_length 1024; # 所压缩文件的最小值,小于这个的不会压缩
gzip_buffers 4 1k; # 设置压缩响应的缓冲块的大小和个数,默认是内存一个页的大小
gzip_comp_level 1; # 压缩水平,默认1。取值范围1-9,取值越大压缩比率越大,但越耗cpu时间

https

# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate

server {
    listen              443 ssl;
    server_name         example.com;

    ssl_certificate     example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;

    ssl_certificate     example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;

    ...
}

# 生成自签证书
# 安装openssl
# 生成私钥
openssl genrsa -des3 -out server.key 4096  -- 密码1234
# 生成CSR
openssl req -new -key server.key -out server.csr
# 去除私钥口令
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key --密码1234
# 生成证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

LVS思想(keepalived)

# 1.关闭 selinux,打开/etc/sysconfig/selinux,设置其中值SELINUX=disabled
# 2.安装依赖包
yum -y install libnl libnl-devel libnfnetlink-devel
# 3.源码安装keepalived
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
# 4.配置/etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_DEVEL		####keepalived的唯一标识
}
vrrp_script chk_http_port {
    script "/etc/nginx/chk_nginx.sh" #心跳执行的脚本
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33 ##系统网上名,可以使用ip addr命令查看
    virtual_router_id 51	##组名,参与此虚拟ip的机器配置一样的值
    priority 200	##优先级,数值大的优先级高,组内最高的胜出
    advert_int 1	##心跳检测1s一次
    authentication {	##心跳检测1s一次
        auth_type PASS
        auth_pass 1111
    }
    track_script {
		chk_http_port	#(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.244.200	##虚拟的ip
    }
}
# 5.脚本
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`	##统计nginx进程数,若为0,表明nginx被杀
if [ $A -eq 0 ];then
		#重启nginx
        /usr/local/openresty/nginx/sbin/nginx                
        #nginx重启失败,则停掉keepalived服务,进行v_ip转移
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        	#杀掉,v_ip就漫游到另一台机器
              killall keepalived    
        fi
fi

问题

  • Nginx为什么快?

http://www.aosabook.org/en/nginx.html

  • Linux的IO模式及原理?Epoll,poll,select?

https://segmentfault.com/a/1190000003063859

  • Nginx是多进程,为什么只有一个pid文件?
  1. 官方文档:https://nginx.org/en/docs/control.html#reconfiguration
  2. pid文件保存的是master进程的pid,使用ps命令可以看到NGINX有多个进程
  3. worker进程详情查看命令:ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep ‘(nginx|PID)’

修改hosts文件不生效

谷歌浏览器、系统都会缓存dns,因此需要全部清除后再重启浏览器即可。

win10电脑清除系统dns缓存:

ipconfig /flushdns

谷歌浏览器清除dns缓存:

  1. 打开浏览器,输入chrome://net-internals/#dns,点击Clear host cache即可;
  2. 有事可能还需要清除Sockets缓存,chrome://net-internals/#sockets,点击Flush socket pools即可。

Linux开放防火墙端口

# 查看防火墙状态
[root@localhost ~]# systemctl status firewallld
# 查看防火墙开放的端口
[root@localhost ~]# firewall-cmd --list-ports
22/tcp 80/tcp 8080/tcp 8888/tcp
# 开启防火墙端口
[root@localhost ~]# firewall-cmd --add-port=443/tcp --permanent
success
# 重启防火墙
[root@localhost ~]# systemctl restart firewalld
[root@localhost ~]# firewall-cmd --list-ports
22/tcp 80/tcp 8080/tcp 8888/tcp 443/tcp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值