Nginx从安装到配置文件详解

nginx的介绍

 
      select和epoll模型
      nginx为epoll模型,apache为select模型
 
指标
select
epoll
性能
随着连接数的增加性能急剧下降。处理千万并发连接数时,性能差
随着连接数的增加,性能基本上没有下降。处理成千上万并发连接时,性能很好
连接数
处理最大连接数不超过1024.如果超过1024个,则需要修改FD_SETSIZE宏,重新编译
连接数无限制
内在处理机制
线性轮询
函数回调callback
开发复杂性
 
Nginx与Apache比较
 
 
Nginx
Apache
占用内存及资源少,可处理高并发请求
rewrite功能强大
本身是反向代理服务器,负载均衡能力突出,可实现分布式架构及高可用集群
动态页面处理能力强
社区活跃,高性能模块出品迅速
bug少,稳定性强
模块化设计,编写模块相对简单
 
 

nginx的处理请求过程:

 

 

1.启动时,解析配置文件,得到需要监听的端口和ip地址

2.nginx的master进程初始化监控socket,再进行监听listen

3.master在fork出多个子进程,竞争accept新的连接

4.客户端向nginx发起连接。当客户端与nginx进行三次握手,建立连接,某个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体,调用相应事件的处理模块。

nginx和lvs的优缺点比较

  nginx lvs
工作在哪一层 第七层 应用层 第四层  网络层
网络依赖 依赖较小,ping的通就可以 比较依赖于网络环境
安装配置上 简单,测试方便 花时间较长
负载能力 负载较高,稳定,没有现成的双机热备方案 负载很高,更稳定,有完整的双机热备方案
故障处理 可以检测到服务器内部的故障,并且会把返回错误的请求重新提交到另一个节点 lvs中ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求
支持应用 能支持http和Email 几乎可以对所有应用做负载均衡

 

一.nginx的安装

1.1rpm安装

    RPM包获取:http://nginx.org/packages/

(1)将nginx放到yum repo库中

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

(2)查看包信息

yum info nginx

(3)安装nginx

yum install nginx

(4)启动nginx

 systemctl start nginx 

1.2yum安装

     yum安装法法简单,但是缺少灵活性;无法自定义模块及安装路径
 

1.3源码安装

源码包获取:http://nginx.org/download/

源码安装法法过程繁琐,但是可定制化安装

 
①安装环境准备,安装依赖包,创建安装目录
[root@localhost ~]# mkdir -p /opt/data/nginx/
[root@localhost ~]# groupadd nginx
[root@localhost ~]# useradd -g nginx nginx
[root@localhost ~]# yum install gcc gcc-c++ make recp pcre-devel openssl openssl-devel -y
[root@localhost ~]# tar -xf nginx-1.14.0.tar.gz -C /usr/local/src/

 

 ②编译安装
[root@localhost nginx-1.14.0]# ./configure --prefix=/opt/data/nginx  --with-http_stub_status_module  --with-http_ssl_module  
[root@localhost nginx-1.14.0]# make &make install
 
③配置环境变量
[root@localhost sbin]# ./nginx -t
[root@localhost sbin]# vim /etc/profile
export PATH=/opt/data/nginx/sbin:$PATH
[root@localhost sbin]# source /etc/profile

 
④nginx配置
[root@localhost nginx]# ln -s /opt/data/nginx/conf /etc/nginx  /usr/local/src/nginx-1.17.5/conf
[root@localhost conf] # vim nginx.conf
user nginx;
pid /var/run/nginx.pid;
events {     
    worker_connections  1024;
     }
http {
   access_log off;
   client_max_body_size 128M;
    include /etc/nginx/conf.d/*.conf;
}
[root@localhost nginx]# mkdir /etc/nginx/conf.d
[root@localhost nginx]# mkdir /var/log/nginx
[root@localhost nginx]# chown -R nginx:nginx /var/log/nginx

 

⑤nginx启动
 
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/opt/data/nginx/sbin/nginx -t -c /opt/data/nginx/conf/nginx.conf ExecStart=/opt/data/nginx/sbin/nginx -c /opt/data/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

nginx -s reload #重启
nginx -s stop #停止
nginx -t#检配置文件是否正常

 

第三方模块
 

二.location规则

   
拦截URL
 
 

2.1 location 规则及其优先级

语法规则:location [=|~|~*|!~|!~*|^~] /uri/ {     
...
}
=           表示精确匹配,优先级也是最高的  
^~          表示uri以某个常规字符串开头,理解为匹配url路径即可              
~           表示区分大小写的正则匹配                                                  
~*          表示不区分大小写的正则匹配                             
!~          表示区分大小写不匹配的正则
!~*         表示不区分大小写不匹配的正则
/           通用匹配,任何请求都会匹配到
 
Location优先级: = > ^~  > ~|~*|!~|!~* > /
相同的优先级,匹配与配置文件的顺序有关,从上到下匹配。
在配置文件中最靠前,先执行
 

三.地址重写

1. URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。

 
1.  rewrite 重写,把web请求重定向到其他URL
2. 从安全角度上讲,如果在URL中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的URL地址可以给我们带来更高的安全性。
3. 实现网站地址跳转,例如用户访问360buy.com,将其跳转到jd.com。例如当用户访问xingyun.com的80端口时,将其跳转到443端口。
 
配置文件server个块写,如:
 
server {
  rewrite  规则  定向路径  重写类型;
}
  规则:可以是字符串或者正则来表示想匹配的目标URL
  定向路径:表示匹配到规则后要定向的路径。如果规则里有正则,则可以使用$index来表示正则捕获分组
  重写类型:
   last:表示完成rewrite,浏览器地址栏URL地址不变
   break:本条规则匹配完成后,终止匹配,不在匹配后面的规则,浏览器地址栏URL地址不变
   redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址不变
   permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

 

4.if判断
 
需要判断当文件不存在时,当路径包含xx时等条件,则需要用到if。
   语法:
if () {
}
当 表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
一些内置判断:
-f和!-f判断文件是否存在
-d和!-d判断是否存在目录
-e和!-e判断是否存在文件或目录
-x和-!x判断文件是否可执行
例:
1.如果文件不存在则返回400
if (!-f $request_filname) {
   return 400;
}
2.如果host不是abc.com,则301到abc.com中
 if ( $host !="abc.com"){
    rewrite ^/(.*)$ http://abc.com/$1 permanent;
}

 

 
在匹配过程中可以引用一些Nginx的全局变量
$args                请求中的参数;
$document_root       针对当前请求的根路径设置值;
$host               请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate        对连接速率的限制; $request_method        请求的方法,比如"GET""POST"等; $remote_addr        客户端地址;
$remote_port        客户端端口号;
$remote_user        客户端用户名,认证用;
$request_filename    当前请求的文件路径名(带root指定的路径)
$request_uri         当前请求的文件路径名(不带root指定的路径 /images/a.jpg)
$query_string        与$args相同; 
$scheme               用的协议,比如http或者是https 
$server_protocol       请求的协议版本,"HTTP/1.0""HTTP/1.1";
$server_addr          服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得址;
$server_name             请求到达的服务器名;
$document_uri         与$uri一样,URI地址;
$server_port         请求到达的服务器端口号;

 

 

四、nginx常见模块以及配置文件

模块
作用
with-http_stub_status_module
记录nginx访问基本状态信息的模块
ngx_http_access_module
访问控制模块,用来控制网站用户对nginx的访问。
ngx_http_rewrite_module
URL地址重写模块
ngx_http_gzip_module
启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
ngx_http_ssl_module
启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
ngx_http_proxy_module
proxy代理模块
ngx_http_log_module
访问日志模块,以指定的格式记录nginx客户访问日志等信息。
ngx_http_fastcgi_module
FastCGI模块,和动态应用相关的模块,如PHP
ngx_http_upstream_module
负载均衡模块,可以实现网站的负载均衡能力及节点的健康检查。
nginx lua
nginx lua防刷规则模型
 

4.1 with-http_stub_status_module

功能:记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态信息。例如:链接数的信息
#虚拟主机配置
server { listen
192.168.25.129:80; #监听端口 server_name www.thinken.com; #服务器域名,可多个,用空格隔开
#定义虚拟主机访问日志 access_log /data/thinken/log/access.log combined; error_log /data/thinken/log/error.log; #查看nginx状态
location
/ { stub_status on; root /data/thinken/basic; #修改登录nginx的主目录 index index.html index.htm; #用于设定访问的默认首页地址 } }
 
结果:
Active connections表示当前活跃的连接数
第三行表示 Nginx当前总共处理了连接数, 成功创建几次握手, 总共处理了请求个数。
最后一行的Reading表示Nginx读取到客户端Header信息数,
Writing 表示Nginx返回给客户端的Header信息数
Waiting 表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
 

4.2 ngx_http_log_module

 
功能:实现对日志格式的设定
 
 
log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '                      
'"$http_user_agent" "$http_x_forwarded_for"';

 

 

4.3. ngx_http_auth_basic_module

 
 
server {       
listen       80;         
server_name  localhost;        
access_log /data/thinken/log/access.log main;             
auth_basic    "oldboy training";     
auth_basic_user_file /opt/data/nginx/conf/htpasswd;         
location / {         
    stub_status on;            
    root   /data/thinken/basic;             
    index  index.html index.htm;        
     }
}
htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
[root@localhost conf]# yum install httpd -y [root@localhost conf]# which htpasswd
/usr/bin/htpasswd [root@localhost conf]# htpasswd -bc /opt/data/nginx/conf/htpasswd admin 123456
Adding password for user admin [root@localhost conf]# chmod 400 /opt/data/nginx/conf/htpasswd [root@localhost conf]# chown nginx /opt/data/nginx/conf/htpasswd [root@localhost conf]# cat /opt/data/nginx/conf/htpasswd
admin:$apr1$yZ2AK1W7$FPrliMJHCv6PI7fkRmXCW1

 


 

 

4.4ngx_http_access_module

功能:限制访问,禁止多允许指定IP或ip段访问某些虚拟主机或目录

 
allow指令
语法:allow [address|CIDR|all] 
使用环境:http,server,location 
作用:允许指定的IP地址或IP地址段访问某些虚拟主机或目录
 
 deny指令 
语法:deny [address|CIDR|all] 
使用环境:http,server,location 
作用:禁止指定的IP地址或IP段访问某些虚拟主机或目录 
  匹配规则 
控制规则按照声明的顺序进行检查,首条匹配IP的访问规则将被使用

 

 
location / {        
stub_status on;             
root   /data/thinken/basic;             
index  index.html index.htm;         
deny 192.168.1.;        
allow 192.168.1.0/24;        
deny all;        
}
优先顺序由上到下
当ip地址不匹配1,2两条规则,将禁止左右ip访问

 

4.5 ngx_http_proxy_module

代理类似一个中介,有正向代理和反向代理

  4.5.1正向代理 

    概念:帮助内网客户端访问外网server
        
功能:
 1.访问原来无法访问的资源
 2.利用正向代理可以对局域网对外网的访问进行必要的监控和管理
 3.对客户端访问授权,上网进行认证
 4.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
 
 注意:正向代理服务不支持外部对内部网络的请求访问
 

  4.5.2反向代理

概念:与正向代理相反,将外网客户端的请求转发至内部服务器
 

 

反向代理是作用在服务器端的,是一个虚拟ip(VIP)。对于用户的一个请求,会转发到多个后端处理器中的一台来处理该具体请求。
反向代理的功能:
   1.保证内网安全,组织web攻击
   2.可对后端服务器实现负载均衡
 总结:

正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.

反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端

 
此模型允许将请求传递给另一个服务器
1、proxy_pass URL; 
该指令用于设置被代理服务器的协议、主机名、IP地址、端口等形式
 
2、proxy_set_header field value;
设定发送后端主机的请求报文的请求首部的值

4.6 ngx_http_upstream_module

功能:实现web服务器的负载均衡,和反向代理可共同使用
   定义一群服务器。服务器可以监听到不同的端口。此外tcp和UNIX-domain socket服务器可以混合定义。
 
.conf文件
 
upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080  max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
}
   server{
  .
  .
  .
将代理服务器收到的用户的信息传到真实服务器上
    location / {
     proxy_pass http://backend;
     proxy_set_header        X-Real-IP       $remote_addr;
   }
}

upstream目前支持4种方式分配
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如: upstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; } 3、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如: upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 4、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream backend { server server1; server server2; fair; }
5.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。hash_method为hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
1.max_fails=3   允许请求失败的次数3
2.fail_timeout=30s   3次请求失败暂停30s时间
3.slow_start=time s设置一台不健康的主机变成健康主机,将其权重由0恢复到标准值的时间。默认为0.
4.backup  将当前服务器为备份服务器。当服务器不可用时,向备用服务器传递请求。
5.down  标记当前服务器为永久不可用

 

实现负载均衡的工具:
软件:nginx,LVS,haproxy
   nginx:七层,四层 应用层,网络层
   LVS:  四层
   haproxy:七层
硬件:
    f5
 
 

posted on 2020-04-22 15:41  lanist  阅读(622)  评论(1编辑  收藏  举报