nginx入门到实战

1.yum -y install gcc gcc-c++ autoconf pcre pcre-devel make
automake 安装扩展

  1. yum -y install wget httpd-tools vim 安装工具
    初始化目录
    cd /opt; mkdir app download logs work backup
  2. ping www.baidu.com 看是否能ping通
    4.关闭防火墙(我没关 不知道会不会出啥幺蛾子 回头再看)
    5.getenforce 查看selinux是否开启(如开启 执行6 没开启执行7)
    6.setenforce 0 关闭selinux

常见的HTTP服务
HTTPD - Apache 基金会
IIS - 微软
GWS - Google

                    为什么选择nginx
              
              原因一 、slinux IO 多路复用epoll

一、什么是IO多路复用
多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程

二、什么是epoll
IO多路复用的实现方式 select、poll、epoll

    select会不停遍历,等待被唤醒,线形遍历
     缺点: 
          1)能够监视文件描述符的数量存在最大限制
          2)线形扫描效率低下
     
      epoll模型
           1)每当FD就绪,采用系统的回调函数之间将fd放入,效率更高
            2)最大连接无限制

                            原因二、轻量级

      功能模块少,代码模块少

                          原因三、CPU亲和

一、扫描是CPU亲和

 是一种把CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上,减少切换cpu的cache miss,获得更好的性能

                        原因四、sendfile

一台服务器需要从内核传输到用户 需要多次切换,nginx2.2+(零拷贝模式)传输静态文件只到内核 传递给socket然后到用户

                   基于Nginx的中间件架构

一、 Nginx快速搭建与基本参数使用

   Mainline version 开发板
   Stable version 稳定版
   Legacy version 历史版本

安装:
http://nginx.org/en/download.html 官网
Linux packages for stable version 点击
[nginx] 找到这行复制
name=nginx repo
baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/(baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

vim /etc/yum.repos.d/nginx.repo 编辑这个文件 黏贴进去
yum -y install nginx 安装
nginx -v 查看版本
nginx -V 查看编译的参数

二、基本参数使用

 1、安装目录讲解
          命令:   rpm -ql nginx 
 路径                                                            类型                                              作用

/etc/logrotate.d/nginx 配置文件 Nginx日志轮转,用于 logrotate服务的日志切割
/etc/nginx 目录、配置文件 Nginx主配置文件
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/etc/nginx/fastcgi_params 配置文件 cgi配置相关,fastcgi配置
/etc/nginx/uwsgi_params
/etc/nginx/scgi_params
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/etc/nginx/koi-utf 配置文件 编码转化映射转换文件
/etc/nginx/koi-win
/etc/nginx/win-utf
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/etc/nginx/mime.types 配置文件 设置http协议的Content-Type与扩展名的对应关系
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/usr/lib/systemd/system/nginx-debug.service 配置文件 用于配置出系统守护进程管理器管理方式
/usr/lib/systemd/system/nginx/service
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/usr/lib64/nginx/modules 目录 Nginx模块目录
/etc/nginx/modules
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/usr/sbin/nginx 命令 Nginx服务的启动管理的终端命令
/usr/sbin/nginx-debug
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/usr/share/doc/nginx-1.12.0 文件、目录 Nginx的手册和帮助文件
/usr/share/doc/nginx-1.12.0/COPYRIGHT
/usr/share/man/man8/nginx/8.gz
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/var/cache/nginx 目录 Nginx的缓存目录
---------------------------------------------------------------华丽丽的分割线----------------------------------------------------------------------------------
/var/log/nginx 目录 Nginx的日志目录

2、安装编译参数
命令: nginx -V
编译选项 作用
--prefix=/etc/nginx 安装目的目录或路径
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx/pid
--lock-path=/var/run/nginx.lock
---------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------------
--httpd-client-body-temp-path=/var/cache/nginx/client_temp 执行对应模块时,Nginx所保留的临时性文件
--httpd-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/chache/nginx/scgi_temp
---------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------------
--user=nginx 设定Nginx进程启动的用户和组用户
--group=nginx
---------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------------
--with-cc-opt=parameters 设置额外的参数将被添加到CFLAGS变量
---------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------------
--with-ld-opt=parameters 设置附加的参数,连接系统库
---------------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------------
3.Nginx默认配置语法

user 设置nginx服务的系统使用用户
worker_processes 工作进程数(保持和cpu核数一样)
error_log nginx的错误日志
pid nginx服务启动时候pid

events
|- worker_connections 每个进程允许最大连接数(65535最大 10000以上足够正常企业使用)
|- use 工作进程数

http{
server{
listen 80; 端口
server_name localhost; 域名

    location /                                         子目录和当前目录
    {
                root   /usr/share/nginx/html;         指定目录
                index   index.html     index.htm     默认访问页面(如果index.html没有找到  那么会去找index.htm)
    }
    error_page    500 502 503 504 /50.html
    location = /50x.html{
      root /usr/share/nginx/html;
  }

}
server{
... ...
}
}

curl -v http://www.imooc.com > /dev/null 查看网页请求和相应信息

  2、Nginx日志类型

包括error.log access_log

error.log 主要记录 nginx处理http请求的错误的状态,以及nginx本身服务的错误状态,按照不同的级别记录

error_log /var/log/nginx/error.log warn;
warn 记录错误日志的级别 可根据个人需要进行调节

access_log 记录nginx每一次http请求的访问状态(用于分析每一次访问的请求和客户的进行交互和行为的分析)

规定了log_format 的格式 命名为main
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  /var/log/nginx/access.log  main;  按照main格式进行写入

main 上下两个名字要对应

nginx.conf 中记录有 上述两个配置文件的位置

  3、Nginx变量

HTTP请求变量 -arg_PARMETER、http_HEADER(request请求里面的head)、sent_http_HEADER(服务端返回给客户端的head)

vim nginx.conf
log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

增加'$http_user_agent' (用户的agent信息) 请求信息到access_log

nginx -t -c /etc/nginx/nginx.conf 检查配置文件是否正确 -c 指定检查路径 (出现successful 表示成功)

nginx -s reload -c /etc/nginx/nginx.conf 重启nginx 并指定配置文件路径

curl http://127.0.0.1 请求几次本机做实验

tail -n 200 /var/log/nginx/access.log 查看access.log日志

log_format 参数讲解

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

$remote_addr 客户端地址
$remote_user http客户端/用户端请求nginx认证的用户名(默认没有开启认证模块不会记录)
$time_local nginx的时间
$request request头的请求行
$status response返回的状态码
$body_bytes_sent 从服务端响应给客户端body的大小
$http_referer 上一个页面的地址(防盗链一类的会在这做)
$http_user_agent 客户端用什么访问的
$http_x_forwarded_for 记录每一级用户通过http请求里面所对应携带的http头信息

      四、Nginx模块讲解

Nginx官方模块
第三方模块

2.安装编译参数详解

编译选项 作用
--with-http_stub_status_module Nginx客户端的状态

http_stub_status_module配置

  Syntax:stub_status;
  Default : --
  Context:server,location

vim defaulte.conf
加入
location /mystatus{
stub_status;
}

nginx -tc /etc/nginx/nginx.conf 检查配置是否有错

nginx -s reload -c /etc/nginx/nginx.conf 重启nginx

访问地址:http://47.93.0.92/mystatus

展示信息
Active connections: 5 nginx当前活跃的连接数
server accepts handled requests
128 128 140 nginx处理的握手的总次数 、处理的连接数 、总请求数
Reading: 0 Writing: 1 Waiting: 4 读,写,等待

      四、默认模块讲解

编译选项 作用
--with-http_random_index_module 目录中选择一个随机主页

2、random_index_module
Syntax: random_index on | off;
Default: random_index off;
Context:location

image.png
image.png

配置后 会随机访问主页面 不会选择隐藏文件

编译选项 作用
--with-http_sub_module HTTP内容替换

2、http_sub_module 语法有多个 列出常用的

替换指定字符串
Syntax: sub_filter string replacement; 模块、内容、替换后的内容
Default: --
Context:http,server,location 加在http下可对多个server生效

在客户端向服务端请求时,用来判断内容是否有更新
Syntax: sub_filter_last_modified on | off;
Default: sub_filter_last_modified off;
Context: http,server,location

匹配所有html中第一个 还是全部 on第一个 off全部
Syntax: sub_filter_once on | off;
Default: sub_filter_once on;
Context: http,server,location

例: 替换字符串

image.png
image.png
image.png
image.png

上图为关闭只匹配一个的选项

八、Nginx的请求限制

连接频率限制 - limit_conn_module
请求频率限制 - limit_req_module

image.png
image.png

HTTP请求建立在一次TCP连接基础上
一次TCP请求至少产生一次HTTP请求

连接限制配置语法

Syntax: limit_conn_zone key zone=name:size;
Default: --
Context:http

Syntax: limit_conn zone number;
Default: --
Context:http,server,location

请求限制配置语法

Syntax: limit_req_zone key zone=name:size rate=rate;
Default: --
Context:http

Syntax: limit_req zone=name [burst=number] [nodelay];
Default: --
Context:http,server,location

连接限制 : 固定写法 客户ip 规定空间1m
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
请求限制:固定写法 客户ip 规定空间1m 1秒请求一次
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;

配置实验:

实验1: 一秒只接受一个ip一次请求
#limit_conn conn_zone 1;
规定 超过指定的数率后 3个放到后一秒执行 其他的不执行
#limit_req zone=req_zone burst=3 nodelay;
#limit_req zone=req_zone burst=3;
limit_req zone=req_zone;

image.png

有19个非200请求

实验2:一秒接受1个ip一次请求 把超出的3个请求放在下一秒执行 其他超出部分直接返回 不执行

    #limit_conn conn_zone 1;
    规定 超过指定的数率后 3个放到后一秒执行 其他的不执行
    limit_req zone=req_zone burst=3 nodelay;
    #limit_req zone=req_zone burst=3;
    #limit_req zone=req_zone;

    
   ![image.png](http://upload-images.jianshu.io/upload_images/5980687-1eb7195f0bcb7659.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有16个非200请求

服务端同一时刻只允许一个ip连接
     limit_conn conn_zone 1;
    规定 超过指定的数率后 3个放到后一秒执行 其他的不执行
    #limit_req zone=req_zone burst=3 nodelay;
    #limit_req zone=req_zone burst=3;
    #limit_req zone=req_zone;


        九 、 Nginx的访问控制

 基于Ip的访问控制 http_access_module
 基于用户的信任登录  http_auth_basic_module


    1. http_access_module
    
     允许   ip          网段      soket   所有
Syntax: allow address | CIDR | unix: | all;
Default: --
Context: http,server,location,limit_except
              禁止   ip          网段      soket   所有
Syntax: deny  address | CIDR | unix: | all;
Default: --
Context: http,server,location,limit_except

实验: 限制自己ip不能访问 其他ip允许访问

location ~ ^/admin.html {
    root /opt/app/code;
    deny 106.121.75.209;
    allow all;  
    index index.html index.htm;
}

实验:限制只能某网段 其他ip不允许 多用于后台
location ~ ^/admin.html {
root /opt/app/code;
allow 106.121.75.0/24;
deny all;
index index.html index.htm;
}

    2. http_access_module 局限性
image.png

通过代理访问后 会识别成代理ip 而非自己本身ip

    3、 http_x_forwarded_for
image.png

http_x_forwarded_for = Client IP , Proxy(1) IP , Proxy(2) IP

    4、http_access_module局限性

方法一、 采用别的HTTP头信息控制访问,如:HTTP_X_FORWARD_FOR
方法二、 结合geo模块作
方法三、 通过HTTP自定义变量传递

      1、  http_auth_basic_module 用户登录认证
                              字符串

Syntax: auth_basic string | off;
Default: auth_basic off;
Context:http,server,location,limit_except
认证存储用户名密码的文件路径
Syntax: auth_basic_user_file file;
Default : --
Context: http,server,location,limit_except

htpasswd -c ./auth_conf jeson 生成一个保存密码的文件

例子:
location ~ ^/admin.html {
root /opt/app/code;
auth_basic "Auth access test!input your password!";
auth_basic_user_file /etc/nginx/auth_conf;
index index.html index.htm;
}

        2、 http_auth_basic_module 局限性

一、 用户信息依赖文件方式
二、 操作管理机械,效率低下

3、解决方案

   一、Nginx结合LUA实现高效验证
   二、Nginx和LDAP打通,利用nginx-auth-ldap模块


               基于Nginx的中间件架构

进阶学习 - 常见Nginx中间架构

一、静态资源web服务
二、代理服务
三、负载均衡调度器SLB
四、动态缓存
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容