Nginx 简介

Nginx

安装环境

安装 gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

安装 PCRE pcre-devel

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

安装 zlib

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

安装 OpenSSL

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

一次性安装所有依赖

yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

安装启动

下载源码,解压

# 下载
wget -c https://nginx.org/download/nginx-1.21.5.tar.gz

# 解压
tar -zxvf nginx-1.21.5.tar.gz

配置安装位置

cd nginx-1.21.5

./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module

--prefix 配置安装目录

--with-http_stub_status_module 提供了访问基础状态信息的功能

--with-http_ssl_module 提供了对 HTTPS 的支持

编译安装

make && make install

运行启动

进入目录,启动运行

cd /opt/nginx/sbin

# 运行
./nginx

./nginx -s stop 关闭 Nginx

./nginx -s reload 重新加载配置文件

检查服务是否启动

[root@rachel sbin]# netstat -tunlp|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      29084/nginx: master

[root@rachel sbin]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sun, 23 Jan 2022 14:34:08 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sun, 23 Jan 2022 14:02:14 GMT
Connection: keep-alive
ETag: "61ed5fe6-267"
Accept-Ranges: bytes

上面两个命令可以查看 nginx 的启动情况。第一个命令可以查看启动的 nginx 端口:0.0.0.0:80

第二个命令可以看出本地地址: 127.0.0.1 已经可以访问了。

如果你的机器是公网IP,此时在任意一台机器的浏览器上访问:IP,譬如:http://45.73.33.222/,就能看到:(如果你的机器IP和某个域名绑定在一起,也可以访问域名:http://www.xxxx.com

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

基础配置结构

先看一下配置文件的基本结构:

...              # 位于所有的配置代码块之外,这里进行的配置是全局设置

events {         # events 块,配置事件驱动模型
   ...
}

http      # http 块
{
    ...  
    server        # server 块,每个 Server{} 代表一个网站(简称虚拟主机)
    { 
        ...      
        location [PATTERN]   # location 块,PATTERN 是 url 的正则匹配字符串,用来进行 url 路由匹配
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ... 
}

状态监控

我们可以监控 nginx 处理了多少请求。

Nginx 软件在编译时有一个 --with-http_stub_status_module 参数,这个模块功能是记录 Nginx 的基本访问状态信息,让使用者了解 Nginx 的工作状态。

[root@rachel nginx]# ./sbin/nginx -V
nginx version: nginx/1.21.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module

最后一行能看出我们之前加了 --with-http_stub_status_module 参数

修改配置文件

使用命令: vi ./conf/nginx.conf 修改配置文件,找到 http {} 中的第一个 server{} , 在里面添加如下内容:

location /status {
	stub_status on;
} 

location 可以指定访问的 url 对应转发的内容。譬如上面的 /status 就是一个 url,如果通过浏览器访问:IP或域名/status 这个 url,nginx 就会执行到这个 location 中

重新加载配置文件:

[root@rachel nginx]# ./sbin/nginx  -s reload

通过 ifconfig 命令查看你自己的本地 IP 地址。浏览器访问:ip/status, 你会看到一个简短的统计信息:

Active connections: 1 				# 活动连接数
server accepts handled requests
 129 129 133 						# 处理的连接;处理的握手;处理的请求数
Reading: 0 Writing: 1 Waiting: 0    # 读取的 header;返回的header;待处理的header

配置访问日志

我们可以在设置中开启日志功能,可以记录每一个处理的请求。

通过 vi ./conf/nginx.conf 命令打开配置文件,在 http {} 中找到如下代码,删除每一行前面的 # 并保存:

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

# 代表注释,默认是把这些行注释掉了,我们需要把上面的代码取消注释。

log_format 关键字可以指定一个格式器。后面的 main 代表了当前格式器的名字,再后面的一大串字符代表了格式器的内容格式, 它有如下格式:

$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
# 通常 web 服务器位于反向代理(nginx)的下游,这样web服务器就不能获取到客户的IP地址了,通过 $remote_add 拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的 http 头信息中,可以增加 http_x_forwarded_for 信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

access_log 关键字,指定了 log存放的位置以及该log使用的格式器的名字

取消上述注释后,重新加载配置文件:

./sbin/nginx -s reload

此时便可以查看log了:

[root@rachel nginx]# tail ./logs/access.log 
207.46.13.160 - - [25/Jan/2022:07:50:32 -0500] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"

自定义错误页面

当我们访问一个不存在的网址时,如:http://ip/xyz,nginx 会自动给我们返回一个 404 的错误页面,这个页面太简陋了,我们其实可以自己定义。

在配置文件中的 http {} 中的 server{} 中,找到如下配置:

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

删除掉 #error_page 前面的 # ,保存并退出。

创建一个 opt/nginx/html/404.html 文件(因为 location{} 中 root 设置的是 html,所以我们要在 html 文件夹下创建它)

404.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404</title>
</head>
<body>
    <p>You are lost here.</p>
</body>
</html>

这样,当你再访问一些不存在的网址时,会返回给你我们自己写的 404.html

多个虚拟主机

多个虚拟主机,其实就是在配置文件的 http{} 中添加多个 server{} ,每个 server{} 中配置不同的域名或端口,这样当用户访问不同的域名或端口时,nginx 会自动根据请求的域名或端口,将请求分发到相应的 server{} 中。

譬如:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    
    # 第一个网站
    server {
        listen       80;			# 网站监听的端口
        server_name  www.test1.cn;  # 网站的域名或IP
        location /{				    # 配置网站的路由:/ 代表网站根目录,即:www.test1.cn/
        	# root 设置网站静态文件的存放目录:html/test1/
            root   html/test1;
            # index 设置的是 nginx 默认使用的网站首页文件,可以设置多个
            index  index.html index.htm;
        }
}
	# 第二个网站
    server {
        listen       80;
        server_name  www.test2.cn;
        location /{
            root   html/test2;
            index  index.html index.htm;
        }
}
    }

禁用某个IP访问

禁止某个IP访问 IP/my_blog/ url 下的所有内容。

location /my_bolg {
    deny 122.71.240.254;
    #alias /opt/nginx1-12/html/av;
    allow 10.1.1.0/16;  
}

反向代理,负载均衡

先说代理,大家可能不陌生,就是从一个局域网访问一个外部网络,如公司内网访问外网,可能需要在电脑上设置代理。它的原理就是,你的电脑上不了外网,没关系,有一个代理服务器它可以访问外网,所以你发送请求给它,它会替你访问外网资源,然后再把外网资源给你,实现让你也能访问外网。

反向代理恰恰相反。你从家里(外网)访问不了公司内网,这时你可以使用公司的 VPN,连上公司的代理服务器,这个服务器可以访问内网资源,它会代替你将请求发送给内网的服务器,内网服务器将请求发送给这个代理服务器,然后它将请求再返回给你,这就是反向代理。

正向代理和反向代理的区别:

正向代理情况下,服务器不知道真正的客户端是谁,因为访问它的是代理服务器。

反向代理情况下,不知道自己想要请求的服务器是谁,因为我们访问的是代理服务器,代理服务器会去访问别的服务器。

更加通俗的比喻:正反代理没有什么本质差异,只是看待的角度问题。譬如你使用代理服务器访问google,这可以看作正向代理;但是从另一方面,google 为了分担压力,拥有很多服务器,当你请求google服务时,google 内部的代理服务器会将你的请求分流到某一台具体的服务器上,这就是反向代理。

负载均衡和反向代理一样,只不过负载均衡是:一台专属的服务器,可以访问很多台内网的服务器(这些服务器的内容都是一样的,譬如淘宝后台有很多服务器,但是每台服务器的内容都是一样的,这样可以分散压力),nginx 服务器会根据一些规则(轮询或者权重),决定去访问哪一台服务器,访问完成后,再将结果返回给用户。

假设我们部署了 nginx 的服务器的IP是:192.168.1.2(也就是所谓的代理服务器),而我们想要访问的服务器是:192.168.1.3192.168.1.4(真正想通过代理访问的服务器)

可以在 192.168.1.2 上对 nginx 做如下配置:

worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    
    # 这里最重要: upstream + 名称 用来定义一组 server;weight 代表权重,数值越大代表访问到它的概率越高
    upstream slave_pools{
    	server 192.168.1.3:80 weight=1;
    	server 192.168.1.4:80 weight=2;
	}
	
    server {
        listen       80;
        server_name  localhost;
        location / {
        	# proxy_pass 设置代理,格式是:http://<upstream设置的名称>
        	proxy_pass  http://slave_pools;
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重新加载配置:./sbin/nginx -s reload, 然后访问 nginx 服务器:192.168.1.2,它会替你将请求发送到 192.168.1.3 或者 192.168.1.4 上,然后再将结果返回给你。

如果你查看访问的日志,会发现:nginx 服务器上的访问记录是来自你的IP(访问nginx 电脑的IP),而192.168.1.3/4 服务器上的访问记录,则是 nginx 服务器的 IP

nginx 配置介绍

nginx目录结构

[root@rachel nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

conf 是放置配置文件的地方

html 是放置网站文件的地方,如 index.html

logs 是放置log的地方

sbin 是放置命令的地方

主要配置

主要配置:

# 定义Nginx运行的用户和用户组
user www www;

# nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
 
# 制定错误日志路径和级别。这个设置可以放入全局、http块、server块中。
# 错误级别依次为:debug|info|notice|warn|error|crit|alert|emerg
error_log /usr/local/nginx/logs/error.log info;

# 存放进程pid的文件
pid /usr/local/nginx/logs/nginx.pid;

# 配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;

# events 块
events
{
    # 事件模型,格式为:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    use epoll;

    # 单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 65535;

    # keepalive 即超时时间。
    keepalive_timeout 60;

    # 客户端请求头的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,这里直接设为 4k。
    # 分页大小可以用命令 `getconf PAGESIZE` 取得。
    # client_header_buffer_size 该值必须设置为“系统分页大小”的整倍数。
    client_header_buffer_size 4k;

    # open_file_cache 可以缓存静态文件的元信息,在这些静态文件被频繁访问时可以显着提升性能。
    # max 指定缓存数量,建议和打开文件数 worker_rlimit_nofile 一致,inactive 是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;

    # 多长时间检查一次缓存的有效信息。
    # 语法:open_file_cache_valid time 
    # 默认值:open_file_cache_valid 60 
    # 可以在以下几个区块中使用此参数:http, server, location
    open_file_cache_valid 80s;

    # open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数。如果超过这个数字,文件描述符一直是在缓存中打开的,如果有一个文件在inactive时间使用的次数小于下面设置的数,它将被移除。
    # 默认值: open_file_cache_min_uses 1 
    # 可以使用此字段的区块: http, server, location
    open_file_cache_min_uses 1;
    
    # 这个指令指定是否在搜索一个文件时记录 cache 错误.
    # 语法:open_file_cache_errors on | off 
    # 默认值:open_file_cache_errors off 
    # 使用字段:http, server, location 
    open_file_cache_errors on;
}
 
 
# 设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
    # 文件扩展名与文件类型映射表
    include mime.types;

    # 默认文件类型
    default_type application/octet-stream;

    # 默认编码
    #charset utf-8;

    # 服务器名字的hash表大小
    # 保存服务器名字的hash表是由指令 server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键值。
    # 因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
    server_names_hash_bucket_size 128;

    # 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
    client_header_buffer_size 32k;

    # 客户请求头缓冲大小。nginx 默认会用 client_header_buffer_size 这个 buffer 来读取header值,如果 header 过大,它会使用 large_client_header_buffers 来读取。
    large_client_header_buffers 4 64k;

    # 设定通过nginx上传文件的大小
    client_max_body_size 8m;

    # sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    # 注意:如果图片显示不正常把这个改成off。
    sendfile on;

    # 从浏览器浏览文件时,启动自动文件索引,默认关闭。
    autoindex on;

    # 此选项允许或禁止使用 socket 的 TCP_CORK 的选项,此选项仅在使用 sendfile 时使用
    tcp_nopush on;
     
    tcp_nodelay on;

    # 长连接超时时间,单位是秒
    keepalive_timeout 120;

    # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    # gzip模块设置
    gzip on; # 开启gzip压缩输出
    gzip_min_length 1k;    # 最小压缩文件大小
    gzip_buffers 4 16k;    # 压缩缓冲区
    gzip_http_version 1.0; # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2;     #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;    # 压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;

    # 开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;



    # 负载均衡配置
    upstream jh.w3cschool.cn {
        # upstream 的负载均衡,weight是权重,可以根据机器配置定义权重。权重越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        # nginx的 upstream 目前支持4种方式的分配
        # 1、轮询(默认)
        # 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器挂了,能自动剔除。
        # 2、weight
        # 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
 
        # 2、ip_hash
        # 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。
        # 例如:
        # upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        # }
        
        # 3、fair(第三方)
        # 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        # upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        # }
        
        # 4、url_hash(第三方)
        # 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
        # 例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method 是使用的 hash 算法
        # upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        # }

        # tips: 定义负载均衡设备的Ip及设备状态
        # upstream bakend {
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        # }
        # 在需要使用负载均衡的server中写上: proxy_pass http://bakend/;
	
        # 每个设备的状态设置为:
        # 1.down表示单前的server暂时不参与负载
        # 2.weight为weight越大,负载的权重就越大。
        # 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
        # 4.fail_timeout:max_fails次失败后,超时时间。
        # 5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

        # nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
        # client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
        # client_body_temp_path设置记录文件的目录 可以设置最多3层目录
        # location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
    }
     
     
     
    # 虚拟主机的配置,每个Server{}代表一个网站
    server
    {
        # 监听端口
        listen 80;

        # 提供服务的域名或主机名,域名可以有多个,用空格隔开
        server_name www.w3cschool.cn w3cschool.cn;
        
        # 服务器返回的默认页面文件(可以指定多个,nginx 会自动匹配)
        index index.html index.htm index.php;
        
        # 首页文件的绝对路径,上面的 index 会在这个目录下查找首页文件
        root /data/www/w3cschool;

        #对 php 结尾的相关页面,进行负载均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        # 图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        # JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        # 日志格式设定
        # $remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
        # $remote_user:用来记录客户端用户名称;
        # $time_local: 用来记录访问时间与时区;
        # $request: 用来记录请求的url与http协议;
        # $status: 用来记录请求状态;成功是200,
        # $body_bytes_sent :记录发送给客户端文件主体内容大小;
        # $http_referer:用来记录从那个页面链接访问过来的;
        # $http_user_agent:记录客户浏览器的相关信息;
        # 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 http_x_forwarded_for 信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        # 定义本虚拟主机处理的所有请求的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        # 对 "/" 启用反向代理
        location / {
        	# proxy_pass 设置反向代理的地址
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            # 以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

            # 允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

            # 缓冲区代理缓冲用户端请求的最大字节数,
            # 如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
            # 无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
            client_body_buffer_size 128k;

            # 表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

            # 后端服务器连接的超时时间_发起握手等候响应超时时间
            # nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;

            #后端服务器数据回传时间(代理发送超时)
            #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

            #连接成功后,后端服务器响应时间(代理接收超时)
            #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
            proxy_read_timeout 90;

            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
            proxy_buffer_size 4k;

            #proxy_buffers缓冲区,网页平均在32k以下的设置
            #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
         
         
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            # htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }
         
        # 本地动静分离反向代理配置
        # 所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            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 http://127.0.0.1:8080;
        }
         
        # 所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}

测试配置是否正确

[root@rachel nginx]# ./sbin/nginx -t
nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/conf/nginx.conf test is successful

Location 配置规则

在上面说过的配置中,server{} 中都会有 location{} ,location 其实就是用来匹配请求的地址的。譬如上面常用的 location / {...} 就是说:当用户请求网站的根目录 / 时,根据 {...} 中的内容来进行返回内容。

因此,我们可以在一个 server{} 中定义多个 location {},可以实现不同 url 的返回内容。

它有如下匹配规则:

  1. = : 表示精确匹配后面的url
  2. ~ : 表示正则匹配,但区分大小写(支持正则)
  3. ~* : 正则匹配,不区分大小写(支持正则)
  4. ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
  5. !~ 和 !~* 分别为区分大小写的不匹配,及不区分大小写的不匹配 的正则(也就是说不匹配某个路径,支持正则)

=:要求路径完全匹配

server {
    server_name website.com;
    location = /abcd {
    […]
    }
}
  • http://website.com/abcd匹配
  • http://website.com/ABCD可能会匹配 ,也可以不匹配,取决于操作系统的文件系统是否大小写敏感(case-sensitive)。ps: Mac 默认是大小写不敏感的,git 使用会有大坑。
  • http://website.com/abcd?param1&param2匹配,忽略 querystring
  • http://website.com/abcd/不匹配,带有结尾的/
  • http://website.com/abcde不匹配

~ :区分大小写的正则匹配

server {
    server_name website.com;
    location ~ ^/abcd$ {
    […]
    }
}
  • http://website.com/abcd匹配(完全匹配)
  • http://website.com/ABCD不匹配,大小写敏感
  • http://website.com/abcd?param1&param2匹配
  • http://website.com/abcd/不匹配,不能匹配正则表达式
  • http://website.com/abcde不匹配,不能匹配正则表达式

~* :不区分大小写的正则匹配

server {
    server_name website.com;
    location ~* ^/abcd$ {
    […]
    }
}
  • http://website.com/abcd匹配 (完全匹配)
  • http://website.com/ABCD匹配 (大小写不敏感)
  • http://website.com/abcd?param1&param2匹配
  • http://website.com/abcd/ 不匹配,不能匹配正则表达式
  • http://website.com/abcde 不匹配,不能匹配正则表达式

alias 和 root

server{}location {} 中,我们可以设置 rootalias ,它们都是用来定位文件路径的,区别如下:

root 代指根目录,请求的路径会进行拼接。

alias 代表路径的别名,请求的路径不会拼接,仅仅是替换。

譬如:

server {
	server_name test.com;
	# alias 类型
    location ^~ /static/ {  
       alias /usr/local/nginx/html/static/;  
    }
	
	# root 类型
    location ^~ /blog/ {  
       root /usr/local/nginx/html/;  
    }
}

访问 alias:

假设我们访问:test.com/static/common.css,实际上访问的是:test.com/usr/local/nginx/html/static/common.css, 看出来了吗,它俩的区别就是将 /static/ 替换成了 /usr/local/nginx/html/static/

访问 root:

假设我们访问:test.com/blog/index.html, 实际上访问的是:test.com/usr/local/nginx/html/blog/index.html, 看出来了吗,它俩的区别就是将 /blog/index.html 拼接到了 usr/local/nginx/html/ 后面。

posted @ 2022-04-18 20:31  wztshine  阅读(265)  评论(1编辑  收藏  举报