Nginx入门及应用

nginx

1.介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

参考博客: https://blog.csdn.net/qq_29677867/article/details/90112120

nginx download 下载地址: http://nginx.org/en/download.html

1.1.几种用法

nginx作为一个高性能的web服务器,有以下几种用法

1.1.1.正向代理

正向代理:内网服务器主动去请求外网的服务的一种行为

正向:相同的或一致的方向

代理:自己做不了的事情或者自己不打算做的事情,委托或依靠别人来完成。

借助解释,回归到nginx的概念,正向代理其实就是说客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了nginx代理服务器去向服务器发起请求,并且获得处理结果,返回给客户端。

从下图可以看出:客户端向目标服务器发起的请求,是由代理服务器代替它向目标主机发起,得到结果之后,通过代理服务器返回给客户端。

在这里插入图片描述

正向代理的配置:

#user  nobody;
worker_processes  4;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    
    server {
       resolver 8.8.8.8;   #dns解析地址
       listen 89;          #代理监听端口
       proxy_connect;
       proxy_connect_allow            443 563;
       location / {
             proxy_pass https://$host$request_uri;     #设定https代理服务器的协议和地址
             proxy_set_header HOST $host;
             proxy_buffers 256 4k;
             proxy_max_temp_file_size 0k;
             proxy_connect_timeout 30;
             proxy_send_timeout 60;
             proxy_read_timeout 60;
             proxy_next_upstream error timeout invalid_header http_502;
       }
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
             root   html;
       }
    }
}

其中

	   resolver 8.8.8.8;   #dns解析地址
       listen 89;          #代理监听端口
       proxy_connect;
       proxy_connect_allow            443 563;

 proxy_pass https://$host$request_uri;     #设定https代理服务器的协议和地址

为重点配置,监听端口可调,其他配置按需添加

测试方式:

  1. 客户机代理配置
    环境变量里添加代理
vim  /etc/profile
~
~
# 在文件末尾添加代理
#export https_proxy=正向代理IP:端口
export https_proxy=192.168.1.104:89

重新加载使配置文件生效

source  /etc/profile
或
.  /etc/profile

临时代理, 测试指令


#curl -i  --proxy 代理IP:端口      要访问域名
curl -i -k  --proxy 192.168.1.104:89  https://www.baidu.com

正向代理的关键配置:

  1. resolver:DNS服务器IP地址
  2. listen:主动发起请求的内网服务器端口
  3. proxy_pass:代理服务器的协议和地址

1.1.2. 反向代理

反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。

反向代理是对于来自外界的请求,先通过nginx统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现的就是一个web服务器,客户端根本不知道“上游服务器”的存在。

在这里插入图片描述

举个栗子:一个服务器的80端口只有一个,而服务器中可能有多个项目,如果A项目是端口是8081,B项目是8082,C项目是8083,假设指向该服务器的域名为www.xxx.com,此时访问B项目是www.xxx.com:8082,以此类推其它项目的URL也是要加上一个端口号,这样就很不美观了,这时我们把80端口给nginx服务器,给每个项目分配一个独立的子域名,如A项目是a.xxx.com,并且在nginx中设置每个项目的转发配置,然后对所有项目的访问都由nginx服务器接受,然后根据配置转发给不同的服务器处理。具体流程如下图所示:

在这里插入图片描述

反向代理配置:

server { 
    #监听端口 
    listen 80; 
    #服务器名称,也就是客户端访问的域名地址 
    server_name  a.xxx.com; 
    #nginx日志输出文件 
    access_log  logs/nginx.access.log  main; 
    #nginx错误日志输出文件 
    error_log  logs/nginx.error.log; 
    root   html; 
    index  index.html index.htm index.php; 
    location / { 
        #被代理服务器的地址 
        proxy_pass  http://localhost:8081; 
        #对发送给客户端的URL进行修改的操作 
        proxy_redirect     off; 
        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
        proxy_max_temp_file_size 0; 
   } 
} 

这样就可以通过a.xxx.com来访问a项目对应的网站了,而不需要带上端口号。

反向代理的配置关键点是:

  1. server_name:代表客户端向服务器发起请求时输入的域名
  2. proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+端口号)。

1.1.3. 透明代理

透明代理:也叫做简单代理,意思客户端向服务端发起请求时,请求会先到达透明代理服务器,代理服务器再把请求转交给真实的源服务器处理,也就是是客户端根本不知道有代理服务器的存在。

举个栗子:它的用法有点类似于拦截器,如某些制度严格的公司里的办公电脑,无论我们用电脑做了什么事情,安全部门都能拦截我们对外发送的任何东西,这是因为电脑在对外发送时,实际上先经过网络上的一个透明的服务器,经过它的处理之后,才接着往外网走,而我们在网上冲浪时,根本没有感知到有拦截器拦截我们的数据和信息。

在这里插入图片描述

有人说透明代理和反向代理有点像,都是由代理服务器先接受请求,再转发到源服务器。其实本质上是有区别的,透明代理是客户端感知不到代理服务器的存在,而反向代理是客户端感知只有一个代理服务器的存在,因此他们一个是隐藏了自己,一个是隐藏了源服务器。事实上,透明代理和正向代理才是相像的,都是由客户端主动发起请求,代理服务器处理;他们差异点在于:正向代理是代理服务器代替客户端请求,而透明代理是客户端在发起请求时,会先经过透明代理服务器,再达到服务端,在这过程中,客户端是感知不到这个代理服务器的。

1.1.4.静态服务器**

现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用Tomcat、Apache等服务器环境的,因此可以直接用nginx来作为静态服务器。

静态服务器的配置如下,其中关键配置为:

  1. root:直接静态项目的绝对路径的根目录。
  2. server_name : 静态网站访问的域名地址。
server { 
       listen  80;                                                          
       server_name  www.xxx.com;                                                
       client_max_body_size 1024M; 
       location / { 
              root   /var/www/xxx_static; 
              index  index.html; 
          } 
   } 

2.nginx的安装

2.1.yum方式安装

安装依赖:

1 yum install pcre

2 yum install pcre-devel

3 yum install zlib

4 yum install zlib-devel

#一键安装上面四个依赖 
 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 


 yum install -y epel-release

安装nginx:

 yum -y install nginx 

检查是否安装成功:

 nginx -v 

查看nginx的安装信息

 whereis nginx

安装后文件位置:

作用位置
Nginx配置路径/etc/nginx/
nginx的配置文件在/etc/nginx/nginx.conf
自定义的配置文件放在/etc/nginx/conf.d
项目文件存放在 , 默认站点目录/usr/share/nginx/html/
日志文件存放在/var/log/nginx/
访问日志/var/log/nginx/access.log
错误日志/var/log/nginx/error.log

事实上,只需知道Nginx配置路径,

其它路径均可在/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf 中查询到nginx相关的验证命令及启动命令

# 启动
 nginx

# 验证nginx配置文件是否正确
 nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

2.2.本地安装

2.2.1.先安装依赖

  • nginx安装依赖GCC、openssl-devel、pcre-devel、zlib-devel软件库。
  • Pcre全称(Perl Compatible Regular Expressions),中文perl兼容正则表达式,pcre官方站点: http://www.pcre.org/。
 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

2.2.2.解压编译

 cd /usr/local
 tar -zxvf nginx-1.20.1.tar.gz
# ...

 mv nginx-1.20.1 nginx
 ls
bin  etc  games  include  lib  lib64  libexec  nginx  nginx-1.20.1.tar.gz  sbin  share  src

 cd nginx
 ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
 ./configure 
# ...
 make && make install
# ...

• auto目录:存放大量的脚本文件,或configure脚本程序相关

• conf目录:存放nginx服务器的配置文件

• contrib目录:存放其他机构或组织贡献的文档资料

• html目录:存放默认网站文件

• man目录:存放nginx的帮助文档

• src目录:存放nginx的源代码

• CHANGES、CHANGES.ru、LICENSE、和README都是nginx服务器的相关文档资料

• configure目录:nginx自动安装脚本,用于检查环境,生成编译代码需要的makefile文件

• sbin目录:nginx启动指令

2.2.3.启动nginx

通过 ./sbin/nginx 启动项目

会报 -bash: nginx: 未找到命令

 vi /etc/profile
# 增加 nginx的环境变量

export PATH=$PATH:/usr/local/nginx/sbin

 source /etc/profile

 ./sbin/nginx
# 又会报异常
nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)
[emerg] 32134#0: open() "/usr/local/nginx/logs/access.log" failed (2: No such file or directory)

# 说明 缺少 logs 文件夹
# 添加文件夹 并授权
 mkdir logs
 chmod 700 logs

# 检测nginx 配置文件
 /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

# 启动
 ./sbin/nginx

# 查看进程
 ps -ef | grep nginx
root      34278      1  0 21:27 ?        00:00:00 nginx: master process ./sbin/nginx
nobody    34279  34278  0 21:27 ?        00:00:00 nginx: worker process
root      34469  11335  0 21:27 pts/0    00:00:00 grep --color=auto nginx

2.3.启动操作

进入 到 sbin 文件夹

 cd /usr/sbin

2.3.1.启动

 ./nginx 

通过 浏览器 访问 对应服务器ip, 打开nginx欢迎页面

在这里插入图片描述
或者
在这里插入图片描述

2.3.2.关闭nginx


 ./nginx -s quit  # 此方式停止步骤是待nginx进程处理任务完毕进行停止。
 ./nginx -s stop  # 此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

2.3.3.重新启动

 ./nginx -s reload

2.3.4.开机自启

每次开机我们面临的一个问题,就是每次都要执行命令,那么这时候有这个需要,设置开机自启动,

开机自动启动的命令为:将Nginx的启动命令添加到/etc/rc.local,命令如下:

 echo "/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf" >> /etc/rc.local

2.3.5.在线安装 完成 可以 直接在主目录下操作

3.实战示例

3.1. 示例一: 反向代理

主配置文件中

http { 
	# 导入 指定文件夹下的配置文件 ,这样可以分文件管理
	include /etc/nginx/conf.d/*.conf;
}

子配置文件 fivemall.conf 放置在 指定的文件夹下

server {
   # 监听的端口
   listen       80;
   # 监听的请求域名
   server_name  fivemall.com;
   location / {
   	   # 代理的 服务器 IP:域名
       proxy_pass http://192.168.3.39:13010;
   }
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   html;
   }
}

在这里插入图片描述

可以通过 SwitchHosts 等工具, 将虚拟机ip绑定成本地域名

3.2.示例二:反向代理(通过网关)

主配置文件, 增加上级域名

http { 
	# fivemall 为上级域名的自定义标识
	upstream fivemall{
		# 网关的 IP:端口
		server 192.168.3.39:9399;
    }
}

修改 子配置文件

server {
   # 监听的端口
   listen       80;
   # 监听的请求域名
   server_name  fivemall.com;
   
   location / {
   	  # 补充 请求头(重点注意)
   	  proxy_set_header Host $host;
   	  # 代理的 为上级域名
      proxy_pass http://fivemall;
   }
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   html;
   }
}

网关增加路由

        - id: fivemall-host-route
          uri: lb://five-mall-goods
          predicates:
            - Host=fivemall.com

在这里插入图片描述

3.3.示例三: 动静分离

在 nginx的 html 文件夹下 新建 static 文件夹 用来存放 静态资源

# 跳转到 html 文件夹
cd /usr/share/nginx/html
# 创建 static 文件夹
mkdir static

将 项目中 原来在static下的静态资源 剪切到 这里( 删除 原项目中对应的内容 )

修改 conf.d 文件夹下 子配置文件 fivemall.conf

增加 静态资源的地址

server {
   listen       80;
   server_name  fivemall.com;
   
   # 增加静态资源地址
   location /static/ {
   	  root  /usr/share/nginx/html;
   }
   
   location / {
   	  proxy_set_header Host $host;
       proxy_pass http://fivemall;
   }
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   html;
   }
}

修改页面静态资源请求路径 在前面 增加 /static

与配置文件对应

这样 页面加载时, 静态资源从 nginx 上加载

在这里插入图片描述

3.4.部署vue项目

修改renren-fast项目中生产环境接口请求地址,将请求地址改为后台服务地址。

/static/config/index-prod.js

 // api接口请求地址
  window.SITE_CONFIG['baseUrl'] = 'http://192.168.22.64:8900/renren-fast';

vue 项目打包

npm run build

打包后项目中出现dist 文件夹 , 是打包完成的文件, 复制到 /usr/share/nginx/html/

在 nginx 中添加配置文件

server {
   # 监听的端口
   listen       8001; 
   # 监听的请求域名
   server_name  fivemall.com;
   
   location / {
     #vue项目的打包后的dist
     root   /usr/share/nginx/html/dist/;
     index  index.html index.htm;
     #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
     try_files $uri $uri/ @router;
     index index.html;
   }
   
   #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
   location @router {
      #因此需要rewrite到index.html中,然后交给路由再处理请求资源
      rewrite ^.*$ /index.html last;
   }
   
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   html;
   }
}

4.nginx 配置文件

4.1.配置文件位置

打开并编辑配置文件:

# 本地安装文件所在位置

$ vi /usr/local/nginx/conf/nginx.conf 

4.2.配置文件示例

一个Nginx配置文件通常包含3个模块:

全局块:比如工作进程数,定义日志路径;
Events块:设置处理轮询事件模型,每个工作进程最大连接数及http层的keep-alive超时时间;
http块:路由匹配、静态文件服务器、反向代理、负载均衡等。

Nginx配置文件示例

# 全局块
 user www-data;
 worker_processes  2;  ## 默认1,一般建议设成CPU核数1-2倍
 error_log  logs/error.log; ## 错误日志路径
 pid  logs/nginx.pid; ## 进程id

# Events块
 events {
   # 使用epoll的I/O 模型处理轮询事件。
   # 可以不设置,nginx会根据操作系统选择合适的模型
   use epoll;
   # 工作进程的最大连接数量, 默认1024个
   worker_connections  2048;
   # http层面的keep-alive超时时间
   keepalive_timeout 60;
   # 客户端请求头部的缓冲区大小
   client_header_buffer_size 2k;
 }

 # http块
 http { 
   include mime.types;  # 导入文件扩展名与文件类型映射表
   default_type application/octet-stream;  # 默认文件类型
   # 日志格式及access日志路径
   log_format   main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main; 
   # 允许sendfile方式传输文件,默认为off。
   sendfile     on;
   tcp_nopush   on; # sendfile开启时才开启。
 
   # http server块
   # 简单反向代理
   server {
     listen       80;
     server_name  domain2.com www.domain2.com;
     access_log   logs/domain2.access.log  main;
     # 转发动态请求到web应用服务器
     location / {
       proxy_pass      http://127.0.0.1:8000;
       deny 192.24.40.8;  # 拒绝的ip
       allow 192.24.40.6; # 允许的ip   
     }
     # 错误页面
     error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
   }
   # 负载均衡
   upstream backend_server {
     server 192.168.0.1:8000 weight=5; # weight越高,权重越大
     server 192.168.0.2:8000 weight=1;
     server 192.168.0.3:8000;
     server 192.168.0.4:8001 backup; # 热备
   }
     
   server {
     listen          80;
     server_name     big.server.com;
     access_log      logs/big.server.access.log main;
     charset utf-8;
     client_max_body_size 10M; # 限制用户上传文件大小,默认1M
     location / {
       # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
       proxy_pass      http://backend_server;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Real-IP  $remote_addr;
     } 
   }
 }

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#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;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

4.3.Nginx各个模块的配置

接下来,我们仔细分析下Nginx各个模块的配置选项。
注意:http块也可以进一步分成3块,

​ http全局块里的配置对所有站点生效,

​ server块配置选项仅对单个站点生效,

​ 而location块的配置仅对单个页面或url生效。

4.3.1.Nginx Location配置

Nginx Location配置是Nginx的核心配置,它负责匹配请求的url, 并根据Location里定义的规则来处理这个请求,比如拒绝、转发、重定向或直接提供文件下载。

URL匹配方式及优先级

Nginx的Location配置支持普通字符串匹配和正则匹配,不过url的各种匹配方式是有优先级的,如下所示:

匹配符 匹配规则 优先级逐级降低

= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配正则 5
!~* 不区分大小写的不匹配正则 6
/ 通用匹配,任何请求都会匹配到 7

为了加深你的理解,我们来看如下一个例子。由于规则2的优先级更高,当用户访问/static/或则/static/123.html时,Nginx会优先执行规则2里的操作,其它的的请求则会交由规则1执行。

 # 规则1:通用匹配
 location / {
 }
 # 规则2:处理以/static/开头的url
 location ^~ /static {                         
     alias /usr/share/nginx/html/static; # 静态资源路径
 }

上例中我们使用了alias别名设置了静态文件所在目录,我们还可以使用root指定静态文件目录。

这里请一定注意alias和root的区别:

root对路径的处理:root路径 + location路径

alias对路径的处理:使用alias路径替换location路径

如果用root设置静态文件资源路径,可以按如下代码设置。两者是等同的。

 # 规则2:处理以/static/开头的url
 location ^~ /static {                         
     root /usr/share/nginx/html; # 静态资源路径
 }

Location还支持正则匹配,比如下例可以禁止用户访问所有的图片格式文件。

 # 拒绝访问所有图片格式文件
 location ~* .*\.(jpg|gif|png|jpeg)$ {
         deny all;
 }

4.3.2.请求转发和重定向

另一个我们在Location块里经常配置的就是转发请求或重定向,如下例所示:

 # 转发动态请求
 server {  
     listen 80;                                                         
     server_name  localhost;                                               
     client_max_body_size 1024M;
     location / {
         proxy_pass http://localhost:8080;   
         proxy_set_header Host $host:$server_port;
     }
 } 
 # http请求重定向到https请求
 server {
     listen 80;
     server_name Domain.com;
     return 301 https://$server_name$request_uri;
 }

无论是转发请求还是重定向,我们都使用了以$符号开头的变量,这些都是Nginx提供的全局变量。它们的具体含义如下所示:

 $args, 请求中的参数;
 $content_length, HTTP请求信息里的"Content-Length";
 $content_type, 请求信息里的"Content-Type";
 $document_root, 针对当前请求的根路径设置值;
 $document_uri,$uri相同;
 $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
 $limit_rate, 对连接速率的限制;
 $request_method, 请求的方法,比如"GET""POST";
 $remote_addr, 客户端地址;
 $remote_port, 客户端端口号;
 $remote_user, 客户端用户名,认证用;
 $request_filename, 当前请求的文件路径名
 $request_body_file,当前请求的文件
 $request_uri, 请求的URI,带查询字符串;
 $query_string,$args相同;
 $scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$
 $scheme://example.com$1 redirect;        
 $server_protocol, 请求的协议版本,"HTTP/1.0""HTTP/1.1";
 $server_addr, 服务器地址;
 $server_name, 请求到达的服务器名;
 $server_port, 请求到达的服务器端口号;
 $uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

知道这些全局变量的含义后,我们就可以限制用户的请求方法。

比如下例中配置了只允许用户通过GET或POST方法访问,其他的请求方法则返回405。

if($request_method !~ ^(GET|POST)$ ){ return 405; }

4.3.3.Nginx静态文件配置

Nginx可直接作为强大的静态文件服务器使用,支持对静态文件进行缓存还可以直接将Nginx作为文件下载服务器使用。

静态文件缓存

缓存可以加快下次静态文件加载速度。

很多与网站样式相关的文件比如css和js文件一般不怎么变化,缓存有效器可以通过expires选项设置得长一些。

     # 使用expires选项开启静态文件缓存,10天有效
     location ~ ^/(images|javascript|js|css|flash|media|static)/  {
       root    /var/www/big.server.com/static_files;
       expires 10d;
     }

静态文件压缩

Nginx可以对网站的css、js 、xml、html 文件在传输前进行压缩,大幅提高页面加载速度。

经过Gzip压缩后页面大小可以变为原来的30%甚至更小。

使用时仅需开启Gzip压缩功能即可。你可以在http全局块或server块增加这个配置。

 http {
     # 开启gzip压缩功能
     gzip on;
     
     # 设置允许压缩的页面最小字节数; 这里表示如果文件小于10k,压缩没有意义.
     gzip_min_length 10k; 
     
     # 设置压缩比率,最小为1,处理速度快,传输速度慢;
     # 9为最大压缩比,处理速度慢,传输速度快; 推荐6
     gzip_comp_level 6; 
     
     # 设置压缩缓冲区大小,此处设置为16个8K内存作为压缩结果缓冲
     gzip_buffers 16 8k; 
     
     # 设置哪些文件需要压缩,一般文本,css和js建议压缩。图片视需要要锁。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
 }

4.3.4.文件下载服务器

Nginx也可直接做文件下载服务器使用,在location块设置autoindex相关选项即可。

 server {
 
     listen 80 default_server;
     listen [::]:80 default_server;
     server_name  _;
     
     location /download {    
         # 下载文件所在目录
         root /usr/share/nginx/html;
         
         # 开启索引功能
         autoindex on;  
         
         # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
         autoindex_exact_size off; 
         
         #显示本机时间而非 GMT 时间
         autoindex_localtime on;   
                 
         # 对于txt和jpg文件,强制以附件形式下载,不要浏览器直接打开
         if ($request_filename ~* ^.*?\.(txt|jpg|png)$) {
             add_header Content-Disposition 'attachment';
         }
     }
 }

4.3.5.Nginx配置HTTPS

 # 负载均衡,设置HTTPS
 upstream backend_server {
     server APP_SERVER_1_IP;
     server APP_SERVER_2_IP;
 }
 
 # 禁止未绑定域名访问,比如通过ip地址访问
 # 444:该网页无法正常运作,未发送任何数据
 server {
     listen 80 default_server;
     server_name _;
     return 444;
 }
 
 # HTTP请求重定向至HTTPS请求
 server {
     listen 80;
     listen [::]:80;
     server_name your_domain.com;
     
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://backend_server; 
      }
     
     return 301 https://$server_name$request_uri;
 }
 
 server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     server_name your_domain.com;
 
     # ssl证书及密钥路径
     ssl_certificate /path/to/your/fullchain.pem;
     ssl_certificate_key /path/to/your/privkey.pem;
 
     # SSL会话信息
     client_max_body_size 75MB;
     keepalive_timeout 10;
 
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://django; # Django+uwsgi不在本机上,使用代理转发
     }
 
 }

4.3.6.Nginx日志配置

Nginx的日志主要包括访问日志access_log和错误日志error_log,你还可以通过log_format定义日志格式。你可以在全局块,Server块或Location块定义日志。比如下例在http块中定义了一个名为main的日志格式,所有站点的日志都会按这个格式记录。

http {
  # 日志格式及access日志路径
   log_format main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main;
 }

access_log文件随着访问记录增多有可能变得非常大,我们可以使用access_log off关闭一些不需要记录的访问。比如当一个站点没有设置favicon.ico时,access_log会记录了大量favicon.ico 404信息, 这是没有必要的, 可以按如下方式关闭访问日志记录。

 location = /favicon.ico {
   log_not_found off; 
   access_log off; # 不在access_log记录该项访问
 }

4.3.7.Nginx超时设置

Nginx提供了很多超时设置选项,目的是保护服务器资源,CPU,内存并控制连接数。你可以根据实际项目需求在全局块、Server块和Location块进行配置。

4.3.7.1.请求超时设置
 # 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
 keepalive_timeout 60;
 
 # 设置请求头的超时时间,可以设置低点。
 # 如果超过这个时间没有发送任何数据,nginx将返回request time out的错误。
 client_header_timeout 15;
 
 # 设置请求体的超时时间,可以设置低点。
 # 如果超过这个时间没有发送任何数据,nginx将返回request time out的错误。
 client_body_timeout 15;
 
 # 响应客户端超时时间
 # 如果超过这个时间,客户端没有任何活动,nginx关闭连接。
 send_timeout 15;
 
 # 上传文件大小限制
 client_max_body_size 10m;
 
 # 也是防止网络阻塞,不过要包涵在keepalived参数才有效。
 tcp_nodelay on;
 
 # 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置。
 # 一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k
 client_header_buffer_size 2k;
 
 # 这个将为打开文件指定缓存,默认是没有启用的。
 # max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
 open_file_cache max=102400 inactive=20s;
 
 # 这个是指多长时间检查一次缓存的有效信息。
 open_file_cache_valid 30s;
 
 # 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
 reset_timedout_connection on;
4.3.7.2.Proxy反向代理超时设置
 # 该指令设置与upstream服务器的连接超时时间,这个超时建议不超过75秒。
 proxy_connect_timeout 60;
 
 # 该指令设置应用服务器的响应超时时间,默认60秒。
 proxy_read_timeout 60# 设置了发送请求给upstream服务器的超时时间
 proxy_send_timeout 60;
 
 # max_fails设定Nginx与upstream服务器通信的尝试失败的次数。
 # 在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。

 upstream big_server_com {
    server 192.168.0.1:8000 weight=5  max_fails=3 fail_timeout=30s; # weight越高,权重越大
    server 192.168.0.2:8000 weight=1  max_fails=3 fail_timeout=30s;
    server 192.168.0.3:8000;
    server 192.168.0.4:8001 backup; # 热备
 }

4.3.8. 负载均衡

负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。

可能绝大部分人接触到的web项目,刚开始时都是一台服务器就搞定了,但当网站访问量越来越大时,单台服务器就扛不住了,这时候需要增加服务器做成集群来分担流量压力,而在架设这些服务器时,nginx就充当了接受流量和分流的作用了,当请求到nginx服务器时,nginx就可以根据设置好的负载信息,把请求分配到不同的服务器,服务器处理完毕后,nginx获取处理结果返回给客户端,这样,用nginx的反向代理,即可实现了负载均衡。

Nginx提供了多种负载均衡算法, 最常见的有5种。我们只需修改对应upstream模块即可。

1.轮询(默认):

每个请求按时间顺序逐一分配到不同的后端服务器,也是nginx的默认模式。如果后端服务器down掉,能自动剔除

轮询模式的配置很简单,只需要把服务器列表加入到upstream模块中即可。

 # 轮询,大家权重一样
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    server 192.168.0.3:8000 down; # 不参与负载均衡
    server 192.168.0.4:8001 backup; # 热备
 }
 
 server {
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;
     
    charset utf-8;
    client_max_body_size 10M; # 限制用户上传文件大小,默认1M
 
    location / {
      # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
      proxy_pass      http://backend_server;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_set_header X-Real-IP  $remote_addr;
    }
2.ip_hash:

每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

下面的配置是指:负载中有三台服务器,当请求到达时,nginx优先按照ip_hash的结果进行分配,也就是同一个IP的请求固定在某一台服务器上,其它则按时间顺序把请求分配给三台服务器处理。

 # IP Hash
upstream backend_server {
    ip_hash;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    server 192.168.0.3:8000;
 }
3.url_hash:

按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理, 后端服务器为缓存时比较有效。

 # URL Hash
 upstream backend_server {
    hash $request_uri;
    hash_method crc32;  
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    server 192.168.0.3:8000;
 }
4.fair 公平:

按后端服务器的响应时间来分配请求,响应时间短的优先分配。使用这个算法需要安装nginx-upstream-fair这个库。

upstream serverList { 
    server 192.168.0.4:8000;
    server 192.168.0.5:8000;
    server 192.168.0.6:8000;
    fair; 
} 
5.补充

而在每一种模式中,每一台服务器后面的可以携带的参数有:

  1. down: 当前服务器暂不参与负载
  2. weight: 权重,值越大,服务器的负载量越大。常用于后端服务器性能不均的情况。不怎么忙的服务器可以多承担些任务。
  3. max_fails: 允许请求失败的次数,默认为1。
  4. fail_timeout: max_fails次失败后暂停的时间。
  5. backup:备份机, 只有其它所有的非backup机器down或者忙时才会请求backup机器。

如下面的配置是指:负载中有三台服务器,当请求到达时,nginx按时间顺序和权重把请求分配给三台服务器处理,例如有100个请求,有30%是服务器4处理,有50%的请求是服务器5处理,有20%的请求是服务器6处理。

upstream serverList { 
    server 1.2.3.4 weight=30; 
    server 1.2.3.5 weight=50; 
    server 1.2.3.6 weight=20; 
} 

如下面的配置是指:负载中有三台服务器,服务器4的失败超时时间为60s,服务器5暂不参与负载,服务器6只用作备份机。

upstream serverList { 
    server 1.2.3.4 fail_timeout=60s; 
    server 1.2.3.5 down; 
    server 1.2.3.6 backup; 
} 

下面是一个配置负载均衡的示例(只写了关键配置):

其中:

upstream:是负载的配置模块,serverList是名称,随便起

server_name:是客户端请求的域名地址

proxy_pass:是指向负载的列表的模块,如serverList

upstream serverList { 
     server 1.2.3.4 weight=30; 
     server 1.2.3.5 down; 
     server 1.2.3.6 backup; 
 }    
  
 server { 
     listen 80; 
     server_name  www.xxx.com; 
    root   html; 
    index  index.html index.htm index.php; 
    location / { 
        proxy_pass  http://serverList; 
        proxy_redirect     off; 
        proxy_set_header   Host             $host; 
   } 
} 

4.4.Nginx与uWSGI服务器的沟通

在前面的案例中,Nginx都是使用proxy_pass转发的动态请求,proxy_pass使用普通的HTTP协议与应用服务器进行沟通。如果你部署的是Python Web应用(Django, Flask), 你的应用服务器(uwsgi, gunicorn)一般是遵守uwsgi协议的,对于这种情况,建议使用uwsgi_pass转发请求。

如果你部署的是Django或则Flask Web应用,一个完整的nginx配置文件如下所示,可以使用通过uWSGI或gunicorn部署的Python Web项目。

 # nginx配置文件,nginx.conf
 # 全局块
 user www-data;
 worker_processes  2;  ## 默认1,一般建议设成CPU核数1-2倍
 
 # Events块
 events {
   # 使用epoll的I/O 模型处理轮询事件。
   # 可以不设置,nginx会根据操作系统选择合适的模型
   use epoll;
   
   # 工作进程的最大连接数量, 默认1024个
   worker_connections  2048;
   
   # http层面的keep-alive超时时间
   keepalive_timeout 60;
   
 }
 
 http {    
     # 开启gzip压缩功能
     gzip on;
     
     # 设置允许压缩的页面最小字节数; 这里表示如果文件小于10k,压缩没有意义.
     gzip_min_length 10k; 
     
     # 设置压缩比率,最小为1,处理速度快,传输速度慢;
     # 9为最大压缩比,处理速度慢,传输速度快; 推荐6
     gzip_comp_level 6; 
     
     # 设置压缩缓冲区大小,此处设置为16个8K内存作为压缩结果缓冲
     gzip_buffers 16 8k; 
     
     # 设置哪些文件需要压缩,一般文本,css和js建议压缩。图片视需要要锁。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
     
     
     upstream backend_server {
         server 192.168.0.1:8000; # 替换成应用服务器或容器实际IP及端口
         server 192.168.0.2:8000;
     }
 
     server {
         listen 80; # 监听80端口
        # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
         server_name localhost; 
 
         charset utf-8;
         client_max_body_size 10M; # 限制用户上传文件大小
         
         # 客户端请求头部的缓冲区大小
         client_header_buffer_size 2k;
         client_header_timeout 15;
         client_body_timeout 15;
     
         access_log /var/log/nginx/mysite1.access.log main;
         error_log /var/log/nginx/mysite1.error.log warn;
         
         # 静态资源路径
         location /static {
             alias /usr/share/nginx/html/static; 
         }
         
         # 媒体资源路径,用户上传文件路径
         location /media {
             alias /usr/share/nginx/html/media;
         }
 
         location / {     
             include /etc/nginx/uwsgi_params;
             uwsgi_pass backend_server;   # 使用uwsgi_pass, 而不是proxy_pass
             uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间
             uwsgi_connect_timeout 600;  # 指定连接到后端uWSGI的超时时间。
             uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间
 
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_redirect off;
             proxy_set_header X-Real-IP  $remote_addr;
         }
     }
     
 } 

如果你的nginx与uwsgi在同一台服务器上,用不到负载均衡,你还可以通过本地机器的unix socket进行通信,这样速度更快,如下所示:

 location / {     
     include /etc/nginx/uwsgi_params;
     uwsgi_pass unix:/run/uwsgi/django_test1.sock;
 }

注意:取决于Nginx采用那种方式与uWSGI服务器进行通信(本地socket, 网络TCP socket和http协议),uWSGI的配置文件也会有所不同。这里以uwsgi.ini为例展示了不同。

uwsgi.ini配置文件

# 对于uwsgi_pass转发的请求,使用本地unix socket通信
# 仅适用于nginx和uwsgi在同一台服务器上的情形
socket=/run/uwsgi/django_test1.sock

# 对于uwsgi_pass转发的请求,使用TCP socket通信
socket=0.0.0.0:8000

# 对于proxy_pass HTTP转发的请求,使用http协议
http=0.0.0.0:8000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值