Nginx认识以及配置

什么是Nginx

Nginx是一个高性能的HTTP和反向代理服务器和负载均衡器,顾名思义nginx常用的功能就是反向代理以及负载均衡。
在后台开发中Nginx经常和服务器集群一起使用,用轮询、权重、ip_hash等策略将请求分发给服务器

在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。

正向代理与反向代理

很多同学估计都用过或者见到过代理服务器这些字样,其实简单理解就是将处理请求的到达

  • 正向代理
    站在用户的角度看,正向代理是用户已经知道要访问哪个IP地址(域名),这个请求发给代理服务器,代理服务器来帮助用户访问,此时隐藏了用户的信息,因为请求这时就是从代理服务器发出的,就像所说的科学上网,大多数科学上网其实就是利用了正向代理

  • 反向代理
    反向代理从用户角度出发,就是用户不知道访问到的真正服务器,但是用户可以访问代理服务器,由代理服务器来分发用户的请求到指定的服务器,并将结果返回给用户,这个过程中,用户不需要知道最终访问的服务器,只要知道反向代理服务器的Ip即可

这里用知乎@阿笠硕士的答案来加深理解 https://www.zhihu.com/question/24723688
在这里插入图片描述

负载均衡

既然是分发请求,那么就有相应的策略,所谓负载均衡就是使用什么策略来实现请求的分发,比如一个有3台服务器的集群,使用轮询的策略来做负载均衡,有3个请求过来了,那么一个请求分发给一个服务器,相当于一台一个,第4个请求过来时,那么会重新将请求分给第一台服务器,依次进行

Nginx环境搭建

通过 http://nginx.org/en/download.html 下载一个nginx服务包,我配置的是Linux版本,将tar包传送到Linux系统下就可以开始搭建环境了,因为Nginx是用C写的,所以需要编译,可以先执行yum -y install gcc gcc-c++ autoconf automake make安装gcc

步骤:

  1. 进行解压安装:tar -zxvf nginx-1.6.3.tar.gz -C [指定目录] /usr/local
  2. 下载所需要的依赖库文件:
    yum install pcre -y
    yum install pcre-devel -y
    yum install zlib -y
    yum install zlib-devel -y
  3. 进到解压目录,进行configure配置,查看是否报错
    cd nginx-1.6.3
    ./configure --prefix=/usr/local/nginx
  4. 在该目录下编译安装:make && make install (安装完之后,在上一级目录可以看到一个nginx文件夹)
  5. 在 /usr/local/nginx目录下,可以看到如下4个目录
    conf配置文件,html网页文件,logs日志文件,sbin主要二进制程序可执行文件
  6. 启动命令:/usr/local/nginx/sbin/nginx
    关闭命令:/usr/local/nginx/sbin/nginx -s stop
    重启命令:/usr/local/nginx/sbin/nginx -s reload
  7. 可以使用netstat -ano | grep 80 查看端口,也可以使用 ps -ef | grep nginx查看进程
  8. 访问浏览器:nginx默认是监听80端口(访问Linux主机的地址,能看到欢迎页面就说明没问题)

注意:如果出现这个错误:./configure: error: C compiler cc is not found
执行这个命令:yum -y install gcc gcc-c++ autoconf automake make

Nginx配置文件

在nginx文件中的conf文件夹中,有一个nginx.conf文件,这里对我们的nginx进行配置,nginx启动的时候会加载这个配置文件,所以每次修改完这个文件,就需要重启nginx

关于nginx.conf文件的详细配置可以参考这一篇 http://www.nginx.cn/76.html ,这里主要讲讲一些常见的配置

server节点

#配置主机,基于域名、ip和端口
server {
    #监听端口(实际开发一般不改)
    listen       80;
    #监听域名(开发中配置成服务所在的域名)
    server_name  localhost;

    #charset koi8-r;
    
    #nginx访问日志放在logs/host.access.log下,并且使用main格式
    #access_log  logs/host.access.log  main;

    #返回的相应文件地址
    location / {      
        #返回根路径地址(相对路径:相对于/usr/local/nginx/)
        root   html;
        #默认访问文件(如果只访问域名,默认访问/index)
        index  index.html index.htm;
    }
}

可以在http节点下配置多个server节点,这几个server同时起作用

log_format日志节点

#日志文件输出格式 这个位置相于全局设置
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

#请求日志保存位置(在server外面,是全局配置)
access_log  logs/access.log  main;
  • 日志的切分
    nginx的日志如果全部记录到一个文件中,将会导致日志文件太大,从而不好查询日志,所以利用Linux的定时器执行shell将日志按照时/天拆分
  1. 首先编写shell脚本,名为backuplog.sh
#!/bin/sh
# 定义变量BASE_DIR和BASE_FILE_NAME
BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=kiring.cn.access.log
# 定义变量CURRENT_PATH和BAK_PATH
CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs
# 定义变量CURRENT_FILE和BAK_TIME和BAK_FILE
CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
# 将文件移动到指定目录
mv $CURRENT_FILE $BAK_FILE
# 重启nginx的日志服务
$BASE_DIR/sbin/nginx -s reopen
  1. 定时任务对脚本进行调度:
    crontab -e
    在接下来的VI编辑器配置
  • */1 * * * sh /usr/local/nginx/sbin/backuplog.sh

location

可以在location实现请求资源匹配

= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
~ 开头表示区分大小写的正则匹配
~*  开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

例如:

# $表示以什么结尾
location ~*.jsp$  {
    root    html;
    index   index.jsp.html  index.htm;
}

表示如果请求以jsp结尾的资源时,都会执行这个location的内容

  • 在location可以配置一些语法如(if(条件为: =~~*)、return、break、rewrite)
location /  {
    if  ($remote_addr = 192.168.122.1)  {
	    return 401;
    }
    root    html;
    index   index.jsp.html  index.htm;
}

这里是判段访问的ip地址是否是192.168.122.1,是的话直接返回401

location /goods {
		rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
		root wolfcode.cn;
		index index.html;
}

这段是将以访问goods-(5位数以内的数字).html的资源重写成访问/goods-ctrl.html资源
利用rewrite可以实现伪静态的功能,就是请求一个html页面,实际上是另外请求到后台的动态资源,因为html比较好爬取,利用rewite可以让搜索引擎更快更好的找到自己

反向代理配置

配置反向代理:proxy_pass url -> 将请求代理给一个指定服务器
配置反向代理的请求头:proxy_set_header -> 设置代理请求的请求头

如果服务器想要获得真正的用户端的ip地址,取消在nginx转发的请求头中利用$remote_addr配置这个请求头,$remote_addr是nginx的其中一个全局常量

例如:

location ~* \.jsp$ {
    proxy_pass http://192.168.116.110:8080;
    proxy_set_header X-real-ip $remote_addr;
}

以jsp结尾的资源请求都将被转发到192.168.116.110这个ip下获取

负载均衡 upstream节点

#设定负载均衡的服务器列表
#upstream myproject {
    #weigth参数表示权值,权值越高被分配到的几率越大
    #max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
    #fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
upstream tomcat_server {   
    server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;   
    server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;   
}

location ~* \.jsp$ {
    proxy_pass http://tomcat_server;
    proxy_set_header X-real-ip $remote_addr;
}

以轮询的方式平均分配请求,如果某一台的服务器性能更好,可以设置weight大小,如果需要使用Ip_Hash,可以在upstream的第一行配置ip_hash
如:

upstream tomcat_server {   
    server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;   
    server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;   
}

猜你喜欢

转载自blog.csdn.net/qq_40233503/article/details/87639821