1.yum -y install gcc gcc-c++ autoconf pcre pcre-devel make
automake 安装扩展
- yum -y install wget httpd-tools vim 安装工具
初始化目录
cd /opt; mkdir app download logs work backup - 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
配置后 会随机访问主页面 不会选择隐藏文件
编译选项 作用
--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
例: 替换字符串
上图为关闭只匹配一个的选项
八、Nginx的请求限制
连接频率限制 - limit_conn_module
请求频率限制 - limit_req_module
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;
有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 局限性
通过代理访问后 会识别成代理ip 而非自己本身ip
3、 http_x_forwarded_for
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
四、动态缓存