Nginx 学习专栏

1 篇文章 0 订阅

Nginx

正向代理,反向代理,负载均衡这些乱七八糟的东西名头统统可以用Nginx来实现。

Nginx

Nginx是一款轻量级的Web服务器和电子邮件(IMAP/POP3)代理服务器。特点是:占用内存少,并发能力强。

Nginx的常用功能

  1. Http代理,反向代理
    Nginx作为web服务器最常用的功能之一,尤其是反向代理
  2. 负载均衡
    负载均衡,内置策略和扩展策略
  3. web缓存
    Nginx可以对不同的文件做不同的缓存处理

Nginx 初探

Nginx的架构

Nginx在启动后,在系统中会以daemon的方式在后台运行。后台进程包含一个master进程和多个worker进程。

  • 我们可以手动的关掉后台模式,让nginx在前台运行
  • 可以通过配置让Nginx取消master进程,从而使Nginx以单进程方式运行。

Nginx默认是以多进程的方式来工作的,Nginx也支持多线程的方式工作。主流方式是使用多进程的方式工作。
Nginx启动后,会有一个master进程和多个worker进程,master进程主要用来管理work的进程
master进程主要包含:

  • 接收来自外界的信号
  • 向各worker进程发送信号
  • 监控worker进程的运行状态
  • 当worker进程退出后(异常情况下)重新启动worker进程

worker进程主要包括:

  • 基本的网络事件的处理
    多个worker之间是对等的

基础概念

Nginx的基本数据化结构

Nginx的配置系统

Nginx的模块化体系结构

Nginx的请求处理

Nginx的安装

Nginx的安装分为使用yum安装和使用rpm包安装,还有就是源码安装。yum安装和rpm包安装同其他软件安装没有什么不同,不在这里进行说明。这里我们使用源码的方式进行安装。

Nginx的依赖安装包:
gcc zlib zlib-devel pcre-devel openssl openssl-devel
下载并且安装

# 创建安装目录
mkdir /opt/nginx
# 解压安装包放到/opt/download
tar -zxvf nginx.tar.gz
# 安装nginx
cd /opt/download/nginx
# 执行命令
./configure --prefix=/opt/nginx --with-openssl=openssl的地址
# 执行命令
make && make install
# 启动nginx
cd /opt/nginx/sbin/
./nginx
# 重新加载nginx配置文件
./nginx -s reload 

nginx 注册服务并且开机自启

# 在/etc/init.d 下创建文件nginx文件拷贝官网内容
#!/bin/sh
#
#nginx - this script starts and stops the nginx daemon
#
#chkconfig:   - 85 15
#description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#proxy and IMAP/POP3 proxy server
#processname: nginx
#config:      /etc/nginx/nginx.conf
#config:      /etc/sysconfig/nginx
#pidfile:     /var/run/nginx.pid

#Source function library.
. /etc/rc.d/init.d/functions

#Source networking configuration.
. /etc/sysconfig/network

#Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
  # make required directories
  user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
  if [ -n "$user" ]; then
     if [ -z "`grep $user /etc/passwd`" ]; then
        useradd -M -s /bin/nologin $user
     fi
     options=`$nginx -V 2>&1 | grep 'configure arguments:'`
     for opt in $options; do
         if [ `echo $opt | grep '.*-temp-path'` ]; then
             value=`echo $opt | cut -d "=" -f 2`
             if [ ! -d "$value" ]; then
                 # echo "creating" $value
                 mkdir -p $value && chown -R $user $value
             fi
         fi
      done
   fi
}

start() {
   [ -x $nginx ] || exit 5
   [ -f $NGINX_CONF_FILE ] || exit 6
   make_dirs
   echo -n $"Starting $prog: "
   daemon $nginx -c $NGINX_CONF_FILE
   retval=$?
   echo
   [ $retval -eq 0 ] && touch $lockfile
   return $retval
}

stop() {
   echo -n $"Stopping $prog: "
   killproc $prog -QUIT
   retval=$?
   echo
   [ $retval -eq 0 ] && rm -f $lockfile
   return $retval
}

restart() {
   configtest || return $?
   stop
   sleep 1
   start
}

reload() {
   configtest || return $?
   echo -n $"Reloading $prog: "
   killproc $nginx -HUP
   RETVAL=$?
   echo
}

force_reload() {
   restart
}

configtest() {
 $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
   status $prog
}

rh_status_q() {
   rh_status >/dev/null 2>&1
}

case "$1" in
   start)
       rh_status_q && exit 0
       $1
       ;;
   stop)
       rh_status_q || exit 0
       $1
       ;;
   restart|configtest)
       $1
       ;;
   reload)
       rh_status_q || exit 7
       $1
       ;;
   force-reload)
       force_reload
       ;;
   status)
       rh_status
       ;;
   condrestart|try-restart)
       rh_status_q || exit 0
           ;;
   *)
       echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
       exit 2
esac

修改上文中的nginx的配置项

nginx='/opt/nginx/sbin/nginx'
NGINX_CONF_FILE='/opt/nginx/conf/nginx.conf'

加入系统服务并且开机自启

# 修改为可执行文件
chmod a+x /etc/init.d/nginx
# 加入服务
chkconfig --add /etc/init.d/nginx
# 设置开机自启动
chkconfig nginx on

加入系统服务之后,可以使用以下命令进行操作

service nginx start 
service nginx stop
service nginx restart

Nginx配置文件结构

**nginx配置中每个指令必须有分号结束 **
nginx 配置文件的文件结构为

  1. 全局块:
    配置影响nginx全局的指令。
    一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成work process数等
  2. events块
    配置影响nginx服务器或用户的网络连接。
    有每个进程的最大连接数,选取那种事件驱动模型处理连接请求,是否允许同时接收多个网路连接,开启多个网络连接序列化等。
  3. http块
    可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等
  4. server块
    配置虚拟主机的相关参数,一个http块中可以有多个server
  5. location块
    配置请求的路由,以及各种页面的处理情况
··· # nginx的全局块
events {
	# evnets 块
}
http{ # http块
	··· # http全局块
	server{ # server块
		··· # server全局块
		location [PATTERN]{ # location块
			···
		}
		location [PATTERN]{ # location块
			···
		}
	}
	server{
		···
	}
	··· # http全局块
}

看个栗子:

#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

nginx的常见配置项:

  1. $remote_addr 和 $http_x_forwarded_for用来记录客户端的IP地址
  2. $remote_user 用来记录客户端的用户名称
  3. $time_local 用来记录访问时间和时区
  4. $request 用来记录请求的url和http协议
  5. $status 用来记录请求状态
  6. $body_bytes_sent 用来记录发给客户端文件主体 内容大小
  7. $http_referer 用来记录从哪个页面链接访问过来的
  8. $http_user_agent 记录客户端浏览器的相关信息

惊群现象: 一个网络连接到来,多个睡眠的进程被同时唤醒,但只有一个能够获得连接,这样会影响性能

Nginx的使用

Nginx代理

Nginx反向代理

Nginx反向代理的简单例子

# http块中设置http全局块upstream
upstream product{
    server 127.0.0.1:8089
}
# 在server块中添加拦截的端口和host
listen  80;
server_name 192.168.1.55;
# server块中添加配置
# 以下设置均可以在location中进行设置
charset utf-8;
proxy_connect_timeout 180;
proxy_send_timout 180;
proxy_read_timout 180;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
# location块设置反向代理的路径(和upstream绑定)
location / {
    proxy_pass http://product;
}

Nginx负载均衡

# 设定负载均衡的服务器列表
upstream load_balance_server {
    server 192.168.1.11:80 weigth=5;
    server 192.168.1.12:80 weight=6;
    server 192.168.1.13:80 weigth=1;
}
# server块配置
server {
	listen 80;
	server_name 192.168.1.14;
	location / {
		# 反向代理的配置
		# proxy_redirect off;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		# 后端的web服务器可以通过X-Forwarded-For获取用户真实IP
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_connect_timeout 90;# nginx跟后端服务器连接超时时间
		proxy_send_timeout 90;# 后端服务器数据回传时间
		proxy_read_timeout 90;# 连接成功后,后端服务器响应超时时间
		proxy_buffer_size 4k;# 设置代理服务器保存用户头信息的缓冲区大小
		proxy_buffers 4 32k;# proxy_buffers缓冲区
		proxy_busy_buffers_size 64k;# 高负荷下缓冲大小 buffers*2
		proxy_temp_file_write_size 64k;# 设定缓存文件夹大小,大于这个值从服务器传
		client_max_body_size 10m;#允许客户端请求的最大单文件字节数
		client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数
	}
}

Nginx的web缓存

通常情况下缓存是用来减少后端压力,将压力尽可能的往前移,减少后端压力,提高网站并发延时。

  • 常见的缓存类型:
    • 服务器端缓存
    • 代理缓存,获取服务器端内容进行缓存
    • 客户端浏览器缓存

Nginx代理缓存的原理:

1.请求数据a
2.请求数据a
3.返回数据a
4.返回数据a
5.请求数据a
6.返回数据a
客户端应用
Nginx
服务层
缓存配置方式

proxy_cache配置语法
缓存路径配置以及语法

# 缓存路径
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size] [manager_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on | off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]

缓存过期周期

# 缓存过期周期
proxy_cache_valid [code ...] time;
# 例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

缓存的维度

proxy_cache_key string;
# 例
proxy_cache_key "$hosts$request_uri $cookie_user";
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
缓存配置实践
系统服务地址
Centos7Nginx Proxy10.192.32.140
Centos7Nginx Web10.192.32.141

Nginx Web 配置

# 建立相关目录
[root@nginx ~]# mkdir -p /soft/code{1..3}
# 建立相关html文件
[root@nginx ~]# for i in {1..3};do echo Code1-Url$i > /soft/code1/url$i.html;done 
[root@nginx ~]# for i in {1..3};do echo Code2-Url$i > /soft/code2/url$i.html;done
[root@nginx ~]# for i in {1..3};do echo Code3-Url$i > /soft/code3/url$i.html;done

# 配置Nginx
[root@nginx ~]# cat /etc/nginx/conf.d/web_node.conf 
server {
        listen 8081;
        root /soft/code1;
        index index.html;
}
server {
        listen 8082;
        root /soft/code2;
        index index.html;
}
server {
        listen 8083;
        root /soft/code3;
        index index.html;
}
[root@proxy ~]# mkdir /soft/cache
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_cache.conf
upstream cache {
    server 10.192.32.141:8081;
    server 10.192.32.141:8082;
    server 10.192.32.141:8083;
}

#proxy_cache存放缓存临时文件
#levels     按照两层目录分级
#keys_zone  开辟空间名, 10m:开辟空间大小, 1m可存放8000key
#max_size   控制最大大小, 超过后Nginx会启用淘汰规则
#inactive   60分钟没有被访问缓存会被清理
#use_temp_path  临时文件, 会影响性能, 建议关闭
proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
        listen 80;
        server_name 10.192.32.140;

#proxy_cache        开启缓存
#proxy_cache_valid  状态码200|304的过期为12h, 其余状态码10分钟过期
#proxy_cache_key    缓存key
#add_header         增加头信息, 观察客户端respoce是否命中
#proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
        location / {
                proxy_pass http://cache;
                proxy_cache code_cache;
                proxy_cache_valid 200 304 12h;
                proxy_cache_valid any 10m;
                add_header Nginx-Cache "$upstream_cache_status";
                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503  http_504;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

使用浏览器访问,可以看到访问成功,然后到cache目录下查看,已经成功生成cache目录

清理proxy_cache代理缓存

shell脚本进行清理,后续添加

nginx缓存的文件不能自动删除,需要借助shell进行删除,后续试验后进行更新。

Nginx的模块

Nginx的handler模块

Nginx的过滤模块

Nginx的upstream模块

Nginx的Core模块

Nginx的event模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值