Nginx 精髓

一、基础

1、泛谈

(1)概念:高性能 Http和反向代理服务器

(2)特点

  • 占用内存少
  • 并发能力强:能达 50000并发

2、配置文件

(1)路径:/usr/local/nginx/conf/nginx.conf

(2)组成

  • 全局:nginx 整体运行的配置指令如 worker_processes
  • events:nginx 与用户的网络连接如 最大连接数worker_connections
  • http:配置 文件引入、日志、超时时间、单连接请求上限等

3、常用命令(先要到 /usr/local/nginx/sbin 目录下)

  • ./nginx -v:版本号
  • ./nginx:启动
  • ./nginx -s stop:停止
  • ./nginx -s reload:重加载

二、反向代理

1、概念

  • 正向代理:代理的是客户端,服务端不知道是哪个客户端请求的
  • 反向代理:代理的是服务端,客户端不知道是哪个服务端提供的服务

2、配置:location里使用 proxy_pass代理,可看 第八点的配置实例

3、匹配原理

  • 先精确匹配:location = /xxx
  • 再一般 uri匹配:location /xxx
  • 最后走正则匹配:location ~ /xxx

注:proxy_pass没有指定URI,请求的URI就像跟客户端发过来一样发送给server;如果proxy_pass指定的是uri,那么当一个请求发送到server,则用proxy_pass指定的uri替换请求匹配部分。

访问代理机的请求(也就是浏览器输入的地址):http://192.168.1.60/index
真正接口地址:http://192.168.1.6:8080/index
listen       80;
server_name  localhost;

#可以访问
location / {
	proxy_pass http://192.168.1.6:8080;
}

#可以访问
location /index {
	proxy_pass http://192.168.1.6:8080;
}

#不可以访问,最后的/ 会将匹配的值也替换掉
location /index {
	proxy_pass http://192.168.1.6:8080/;
}

#不可以访问
location / {
	proxy_pass http://192.168.1.6:8080/index;
}

#可以访问
location /index {
	proxy_pass http://192.168.1.6:8080/index;
}

//另外的情况
访问代理机的请求(也就是浏览器输入的地址):http://192.168.1.60/api/index
真正接口地址:http://192.168.1.6:8080/api/index
listen       80;
server_name  localhost;

#可以访问
location / {
	proxy_pass http://192.168.1.6:8080;
}

#不可以访问
location /index {
	proxy_pass http://192.168.1.6:8080;
}

#不可以访问
location / {
	proxy_pass http://192.168.1.6:8080/api;
}

#不可以访问
location /index {
	proxy_pass http://192.168.1.6:8080/api;
}

#不可以访问
location / {
	proxy_pass http://192.168.1.6:8080/api/index;
}

#不可以访问
location /index {
	proxy_pass http://192.168.1.6:8080/api/index;
}

#可以访问
location / {
	proxy_pass http://192.168.1.6:8080;
}

#可以访问
location /api {
	proxy_pass http://192.168.1.6:8080;
}

#不可以访问
location / {
	proxy_pass http://192.168.1.6:8080/api;
}

#可以访问
location /api {
	proxy_pass http://192.168.1.6:8080/api;
}

三、负载均衡

1、简介:把请求分发到多台服务器上

2、配置:配置 upstream,可看 第八点的配置实例

3、策略

  • 轮询(默认):按请求顺序轮询分发
  • weight 权重:权重越高,分配越多
  • ip 哈希:根据 访问者ip 哈希后分配,即同个客户端访问的都是同个服务器(可用于 session共享)
  • fair 响应:根据响应时间,响应越快分配越多

四、静态资源 & 缓存

1、简介:动态页面和静态页面分开服务器解析,nginx 根据动态请求和静态请求分离,加快速度。

2、静态资源配置 & 缓存配置:可看 第八点的配置实例。

3、缓存原理:配置的天数内访问该 url,浏览器发送一个请求比对服务器此文件更新时间,若没变化则不会去服务器拉取文件并返回状态码 304,若有变化则从服务器下载并返回 200。

4、gzip压缩:server 中配置 gzip。

五、原理

1、机制:master & worker,利用 io多路复用由一个 master负责接收请求,多个worker进程争抢处理 

2、优点

  • 实现 nginx -s reload 的热部署
  • worker相互不影响,程序异常也不影响其他请求

3、设置

  • 设置 worker数:worker_processes(最好跟 cpu数相同)
  • 每个 worker最大连接:worker_connection
  • 最大并发数:worker_connections * worker_processes/2(静态资源),worker_connections * worker_processes/4(动态资源)

六、集群

结合 keepalived实现高可用

七、配置注释

注:详细配置请看手册:http://www.nginx.cn/nginx-how-t

#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#工作模式及连接数上限
events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    #仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll; 

    #单个后台worker process进程的最大并发链接数    
    worker_connections  1024;

    # 并发总数是 worker_processes 和 worker_connections 的乘积
    # 即 max_clients = worker_processes * worker_connections
    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
    # 为什么上面反向代理要除以4,应该说是一个经验值
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
    # worker_connections 值的设置跟物理内存大小有关
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
    # $ cat /proc/sys/fs/file-max
    # 输出 34336
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
    # 使得并发总数小于操作系统可以打开的最大文件数目
    # 其实质也就是根据主机的物理CPU和内存进行配置
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
    # ulimit -SHn 65535

}


http {
    #设定mime类型,类型由mime.type文件定义
    include    mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    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  logs/access.log  main;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile     on;
    #tcp_nopush     on;

    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay     on;

    #开启gzip压缩
    gzip  on;
    gzip_disable "MSIE [1-6].";

    #设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;


    #设定虚拟主机配置
    server {
        #侦听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;

        #定义服务器的默认网站根目录位置
        root html;

        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;

        #默认请求
        location / {
            
            #定义首页索引文件的名称
            index index.php index.html index.htm;   

        }

        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            
            #过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

         ~/(v1|v2) #匹配多个

        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        #禁止访问 .htxxx 文件
            location ~ /.ht {
            deny all;
        }

    }
}

八、配置实例

修改原有的默认配置文件 /usr/local/nginx/conf下的 nginx.conf (也可 屏蔽原来的 server节点,增加 include /usr/local/nginx/conf/conf.d/*.conf; 来使用多个配置文件)

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /usr/local/nginx/logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    include /usr/local/nginx/conf/conf.d/*.conf;

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

1、配置访问自己的主页

  • 在 /usr/local/nginx/conf下新建 conf.d 目录,用于统一放服务配置文件,里面新建一个my.conf,里面内容如下
#如果多个转发,增加一个server节点即可
server {
    listen       80;
#如果有多个,server_name 后面的值用空格隔开
    server_name  localhost;
    location / {
        root   /usr/local/nginx/html;
        index  my.html my.htm;
    }
}
  • 到 /usr/local/nginx/html 下新建 my.html 文件
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>success</h1>
</body>
</html>
  • 到 /usr/local/nginx/sbin,./nginx -s reload ,访问浏览器查看结果

 

2、正向代理

  • 修改一下我们的 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
#代理转发到的ip
resolver 8.8.8.8;
server {
	listen 80;
	#这里不需要 server_name节点
	location / {
		proxy_pass http://$http_host$request_uri;
	}
}

3、反向代理

  • 修改一下我们的 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://192.168.1.60:81;
    }
}

   

4、负载均衡

  • 同样修改 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
#weight是权重,默认是1,越高请求数越多
upstream mytest {
   server 192.168.1.60:81 weight=2;
   server 192.168.1.60:8080;
}
#请求到端口80的将其传递给上游。
#上游名称也就是上面upstream后面的名字和proxy_pass后面的http://后面的名字需要匹配。
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://mytest; 
    }
}


// 这种是 iphash策略
upstream mytest {
   ip_hash ;
   server 192.168.1.60:81 weight=2;
   server 192.168.1.60:8080;
}

// 这种是 fair策略
upstream mytest {
   server 192.168.1.60:81 weight=2;
   server 192.168.1.60:8080;
   fair;
}

5、静态资源

server {
        listen       80;
        server_name  localhost;
        # root的处理结果是:root路径+location路径
        location / {
            root /opt/mytest/;
			index index.html;
        }
		# alias的处理结果是:使用alias路径替换location路径
		location /case/xiong {
			 alias  /opt/mytest/test;
			 index  xiong.html;
		}
	}

5、缓存

server {
        listen       80;
        server_name  localhost;
        # 可开启 gzip 压缩
        gzip on;
        # 3d 表示 3天,s|m|h|d 表示秒|分|时|天
        location / {
            root /opt/mytest/;
			expires 3d;
        }
	}

6、https 配置

# 需要先申请 https证书,然后放到服务器,配置中指定证书路径

server {
         listen       80;
         listen       443 ssl;
         server_name  lin.example.com;
         ssl_certificate /usr/local/nginx/conf/4086866_lin.example.com.pem;
         ssl_certificate_key /usr/local/nginx/conf/4086866_lin.example.com.key;
         ssl_session_timeout 5m;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;

         location / {
                 proxy_connect_timeout 90;
                 proxy_send_timeout 90;
                 proxy_redirect off;
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header remote_addr $remote_addr;
                 proxy_pass  http://127.0.0.1:8082;
        }
    }

九、扩展

1、日志

  • error.log:记录异常日志
  • access.log:记录正常日志

2、rewrite

  • url 重写
  • if 判断
  • return

3、window下配置静态文件

        location /MP_verify_2HiL64Xrgdw2TMN7.txt {
            root   D:/Company/Server/Wj/survey-server/interfaces/src/main/resources/static;
        }

十、安装

1、普通版本安装

  • 先安装辅助工具
#安装 make
yum -y install gcc automake autoconf libtool make
#安装 g++
yum install gcc gcc-c++
#安装 pcre,为了重写rewrite
yum install -y pcre pcre-devel
#安装 zlib,为了gzip压缩
yum install -y zlib zlib-devel
#安装 openssl,安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议
yum install -y openssl openssl-devel
  • 到 nginx: download 下载所需的nginx版本,上传到服务器 /usr/local/src ,然后解压,安装
#解压
tar -zxvf nginx-1.10.3.tar.gz
cd nginx-1.10.3
# 然后增加配置
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
#安装,还是到 nginx-1.10.3 目录下
make
make install
  • 成功后看一下 /usr/local/nginx 目录
  • 启动
#启动前先创建 /var/temp/nginx 目录,因为刚才安装时配置是用到这个目录,接着再启动
cd /usr/local/nginx/sbin
./nginx

#如果是关闭,则是
./nginx stop
#如果是重启,则是
./nginx -s reload
  • 查看进程是否正常启动,然后访问浏览器,默认是80端口

   

   

2、docker版本安装

  • docker search nginx ,看看版本
  • 拉取镜像 docker pull docker.io/nginx
  • 完成后看一下本地镜像 docker images nginx
  • 运行镜像 docker run --name nginx -p 18080:80 -d docker.io/nginx ,再到浏览器访问 ip/port ,看到以下界面即成功

   

  • 接着先在主机 /etc/nginx 下创建 www、logs、conf 三个文件夹如下。复制docker内的nginx配置到主机,我的容器id是55de6205da3a,复制后启动另一个容器

  

#复制配置文件
docker cp 55de6205da3a:/etc/nginx/nginx.conf /etc/nginx/conf/
#启动另一个容器,-v 引号前面是主机地址,后面是容器地址,表示指定的主机地址挂载到容器的地址,也就是容器访问地址映射到主机
docker run -d -p 18082:80 --name nginx-test -v /etc/nginx/www:/usr/share/nginx/html -v /etc/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /etc/nginx/logs:/var/log/nginx docker.io/nginx
  • 到主机 /etc/nginx/www 创建一个简单测试网页 index.html ,访问浏览器查看结果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
    <h1>hello world</h1>
</body>
</html>

   

  • 如果是重启可以用下面的指令
docker exec -it id nginx -s reload

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值