2018-9-20 直播课堂笔记

 

1.默认虚拟主机

2.Nginx用户认证

3.Nginx域名重定向

4.Nginx访问日志

5.Nginx防盗链

6.Nginx访问控制

7.Nginx解析php相关配置

8.Nginx代理

扩展知识:NGINX location 在配置中的优先级

location表达式类型

location优先级说明


 


1.默认虚拟主机

1.1首先我们要编辑配置文件: vim /usr/local/nginx/conf/nginx.conf 增加: include vhost/*.conf

1.2 生效配置文件

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。
而且,可以显式地设置某个主机为默认虚拟主机,即在"listen"指令中设置"default_server"参数:

如果没有在虚拟主机中配置default那么就会以
创建vhost目录: mkdir /usr/local/nginx/conf/vhost
进入vhost目录下并创建编辑一个.conf文件: 
cd /usr/local/nginx/conf/vhost 加入如下内容
这里面产生很多conf,以ASCii码排序在前面的第一个为默认虚拟主机

2.Nginx用户认证

2.1配置文件

 location/
       {
            auth_basic "User Authentication";
            auth_basic_user_file /usr/local/nginx/conf/htpasswd;
       }
}

备注:一定要注意auth_basic_user_file路径,否则会不厌其烦的出现403。

1.针对目录的用户认证: 在location后面加上目录名字即可
2.针对文件的用户认证: 在location后面加上匹配文件名字,下图的意思就是匹配到admin.php这个文件就需要用户认证

3.Nginx域名重定向

3.1 配置文件

server
{
    listen 80;
    server_name test.com test1.com test2.com;
    //server_name后面支持写多个域名,这里要和httpd的做一个对比
    index index.html index.htm index.php;
    root /data/wwwroot/test.com;
    if ($host != 'test.com' ) {
        rewrite  ^/(.*)$  http://test.com/$1  permanent; 
        //permanent为永久重定向,状态码为301,如果写redirect则为302
    }
}

3.2 重定向状态码

一.last & break

    (1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。

注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location

    (2)last 和 break 当出现在location 内部时,两者就存在了差异

       last: 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚刚的行为

       break: 使用了break 指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。

二、permanent & redirect:

    permanent: 永久性重定向。请求日志中的状态码为301

    redirect:临时重定向。请求日志中的状态码为302

    从实现功能的角度上去看,permanent 和 redirect 是一样的。不存在好坏。也不存在什么性能上的问题。但是对seo会有影响,这里要根据需要做出选择

    在 permanent 和 redirect  中提到了 状态码 301 和 302。 记住:last 和 break 想对于的访问日志的请求状态码为200

    这两类关键字差异:

  当你打开一个网页,同时打开debug 模式时,会发现301 和 302 时的行为是这样的。第一个请求301 或者 302 后,浏览器重新获取了一个新的URL ,然后会对这个新的URL 重新进行访问。所以当你配置的是permanent 和 redirect ,你对一个URL 的访问请求,落到服务器上至少为2次;而当你配置了last 或者是break 时,你最终的URL 确定下来后,不会将这个URL返回给浏览器,而是将其扔给了fastcgi_pass或者是proxy_pass指令去处理。请求一个URL ,落到服务器上的次数就为1次。

 

注意:配置last 在跨域的时候效果和redirect一致,都是返回302状态码,请求地址也发生改变

4.Nginx访问日志

4.1Nginx会把每个用户访问往咱的日志信息记录到指定的日志文件里,供网站管理员分析用户浏览行为等,此功能又 ngx_http_log_module 模块负责。

4.2 访问日志参数

Nginx访问日志主要有两个参数控制

log_format  #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)

access_log  #用来指定日至文件的路径及使用的何种日志格式记录日志

4.3配置文件

#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

#    '$status $body_bytes_sent "$http_referer" '

#   '"$http_user_agent" "$http_x_forwarded_for"';

字段解释:

remote_addr : 客户端地址
remote_user : 客户端用户名
time_local : 服务器时间
request : 请求内容,包括方法名,地址,和http协议
http_host : 用户请求是使用的http地址
status : 返回的http 状态码
request_length : 请求大小
body_bytes_sent : 返回的大小
http_referer : 来源页
http_user_agent : 客户端名称
request_time : 整体请求延时

5.Nginx防盗链

5.1配置文件

server {

    listen 80;

    server_name 192.168.0.116;    ///被访问的域名

    location ~*.(gif|jpg|png|swf|flv)$ {    ///定义对gif/jpg/png/swf/flv等静态页面进行防盗

root /usr/local/nginx/html;    ///指定上述静态页面放在的位置

valid_referers none blocked 192.168.0.115;    ///指定哪个域名可以访问本静态服务器,也可以是ip地址,这里我指定的是192.168.0.115,也就是内部的前端apache服务器,只允许这台访问。

if ($invalid_referer) {

   return 403;    ///如果有其他机器访问这台nginx服务器就会给那台机器返回一个403访问禁止的页面,也就是说如果出现了盗用现象就提示403错误。

}
    }

}


注意这一行 “valid_referers none blocked" 其中"none" "blocked" 的意思分别是:

none代表没有referer;blocded代表有referer但是被防火墙或者是代理给去除了。

首先当我输入我要打开的网址的时候,因为是直接输入的没有referer所以匹配了
valid_referers后面的none或者是blocked 所以invalid_referer值为0 所以不进行跳转.
当我是从这个网站里面的链接跳到该网站首页的时候 因为referer的值是肯定包含srever_names 所以匹配了server_names所以不进行跳转。
当我从搜素引擎进去的时候因为referer字段类似于www.google.com.hk/search
开始进行匹配 发现没有一个匹配,则此时会设置invalid_referer值为1 if语句成功执行,进行了跳转. 达到功能
如果把这两个(none,blocked)去掉就可以真正的实现防盗连了!因为只有匹配到server_name的时候,才不会进行跳转。

6.Nginx访问控制

6.1配置文件 

基于IP的访问控制,基于Nginx的http_access_module模块,是Nginx本身内置的模块,不需要安装的时候配置。也就是允许哪些IP访问,不允许哪些IP访问
location / 
{ 
deny 192.168.1.1; 
allow 192.168.1.0/24; 
allow 10.1.1.0/16; 
allow 2001:0db8::/32; 
deny all; 
} 
从上到下的顺序,类似iptables。匹配到了便跳出。
如上的例子先禁止了192.16.1.1,接下来允许了3个网段,
其中包含了一个ipv6,最后未匹配的IP全部禁止访问.

7.Nginx解析php相关配置

7.1 配置文件

配置如下:
location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www/test02$fastcgi_script_name;
    }
fastcgi_pass 用来指定php-fpm监听的地址或者socket
fastcgi_index index.php #设定访问根目录默认去找的文件
fastcgi_param SCRIPT_FILENAME /data/www/test02$fastcgi_script_name #设置访问根目录时默认寻找的文件
fastcgi_param SCRIPT_FILENAME /data/www/test02/abc$fastcgi_script_name #访问根目录www.test02.com/
会去默认寻找abc中index.php文件,而此时去访问这个index.php文件是寻找不到的只能通过根目录去访问
www.test02.com/abc/index.php 返回404

查看/usr/local/php-fpm/etc/php-fpm.conf
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
;listen = 127.0.0.1:9000
listen.mode = 666
user = php-fpm
group =php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers =5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
此文件设定了nginx 绑定的位置去给php-fpm解析

unix socket方式

优点:
unix socket方式要比tcp的方式快,而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。会有很多linux傻瓜面板,他们可能会有很多中 php-fpm的版本,那么如果是不同版本去开不同的端口,然后nginx去配置的话,你要记住很多端口,sock文件便是解决这个问题最简单的方法。Socket是使用unix domain socket连接套接字/devm/php-cgi.sock(很多教程使用路径/tmp,而路径/devm是个tmpfs,速度比磁盘快得多)
缺点:
unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。虽然sock有更少的数据拷贝和上下文切换,更少的资源占用,但是如果数据都是错的,那还有什么用呢。另外使用sock的话,必须nginx和fpm在同一台机器上

tcp方式
优点:
从稳妥的考虑肯定是使用tcp,tcp协议能保证数据的正确性,sock不能保证。可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式

缺点:
性能不如unix socket

8.Nginx代理

 nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。

server
 {
 listen 80;
 server_name baidu.com;
 location /
	{
 proxy_pass	http://220.181.111.188/;
 proxy_set_header Host   $host;
 proxy_set_header X-Real-IP      $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	}
 }

proxy_pass:指定将请求代理至upstream server的URL路径;proxy_set_header:将发送至upsream server的报文的某首部进行重写;

扩展知识:NGINX location 在配置中的优先级

location表达式类型

  • ~ 表示执行一个正则匹配,区分大小写
  • ~* 表示执行一个正则匹配,不区分大小写
  • ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
  • = 进行普通字符精确匹配。也就是完全匹配。
  • @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

location优先级说明

在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列说明:

  1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  2. ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  3. 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  4. 常规字符串匹配类型。按前缀匹配。

猜你喜欢

转载自blog.csdn.net/a1779078902/article/details/82798071
今日推荐