企业级nginx基础、负载、读写分离技术

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

Nginx配置文档:http://nginx.org/en/docs/

NGINX 安装文档:https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/

nginx模块及中文手册:http://www.nginx.cn/doc/index.html

应用层:nginx、haproxy、apache、varnish

LNMP:linux+nginx+mysql+php

I/O模型

同步阻塞讲解

同步阻塞

同步非阻塞

event dirver

一、NGINX简介

374939.tmp

sendfile本身是一种技术,帮助系统省去了一些步骤,比如nginx对用户请求做出相应并从内核交流取得数据,然后再封装给网络协议的一个过程。sendfile提高了web服务的性能。

传统上基于进程和线程模型架构的web服务通过每进程或者每线程处理并发连接请求,势必会在网络和IO上产生阻塞,这样产生的结果必然是对内存和cpu利用率的降低,为了改变这种状况就会产生出一个新的进程或者线程,需要对事先准备好起运行环境,这包括为其分配内存堆和栈、以及为其创建新的执行上下文等,这些操作都需要占用cpu,而过多的线程还会带来线程抖动和频繁的上下文切换,系统性能也会有进一步下降。

在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型,受启发于多种操作系统赛尔号中基于“事件”的高级处理机制,nginx采用了模块化,事件驱动,异步,单线程以及非拥塞的架构,并大量采用了多路复用即事件通知的机制,在nginx中,连接请求由为数不多的几个仅仅包含一个线程的进程worker以高新的回环机制进行处理,而每个worker可以并行处理数千个并发连接和请求,。

nginx会按需同时运行多个进程,一个主进程和几个工作进程,配置了缓存时还会有缓存加载器进程和缓存管理器进程等、所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间的通信,主进程以root用户身份运行,而worker、cache loader 和cachemanager均应以非特权用户身份运行。

二、NGINX主要特性

主进程主要完成的任务:

1、读取并验证配置信息。

2、创建、绑定及关闭套接字、

3、启动、终止及维护worker进程的个数。

4、无须终止服务而重新配置工作特性。

5、控制非中断式程序升级,启动新的二进制程序并在需要的时候回滚至老版本。

6、重新打开日志文件,并实现日志滚动。

7、编译嵌入式perl脚本。

8、不支持动态加载模块的功能,所以需要的模块需要一次性编译好。

worker进程主要完成的任务
1、 接收、传入并处理用户端的连接。

2、提供反向代理即过滤功能。

3、nginx任何能完成的其他功能。

实现缓存需要的进程:

cache loader进程主要完成的任务

1、检查缓存存储中的缓存对象。

2、使用缓存元数据建立内存数据库

cache manager进程的主要任务

1、缓存的失效和过期检查。

三、安装nginx

1、依赖关系

编译安装nginx需要事先安装开发包组“Development Tools”,同时,还需要专门安装pcre-devel软件包,zlib、openssl软件包。

[root@node6.dtedu.com ~/nginx-1.9.12]# yum install openssl-devel pcre-devel 

[root@10 nginx-1.9.12]# yum groupinstall 'Development Tools'


a、pcre软件包,主要响应nginx的核心和rewrite模块功能,支持正则表达式

注意一点,在编译安装的时候使用--with-pcre=指向的路径是pcre文件的源码包路径,而不是安装路径。其他软件包也是一样的需要指向未安装的源码包。

b、zlib,支持nginx的头文件压缩

c、openssl,支持nginx的ssl模块,实现https功能。

首先添加用户nginx,实现运行nginx服务的进程

[root@10 nginx-1.9.12]# groupadd -r nginx

[root@10 nginx-1.9.12]# useradd -r -g nginx nginx


-r:创建系统账号

-g:指定用户的初始化用户组

-M:不创建用户的家目录

-s:指定用户登录的shell

-m:指定用户的家目录

编译参数:

--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--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
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-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/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-mail
--with-mail_ssl_module
--with-file-aio
--with-http_spdy_module
--with-ipv6

[root@node6.dtedu.com ~/nginx-1.9.12]# 

./configure --prefix=/usr/local/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/accesslog --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcig --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre


查看启动状态:

[root@node6.dtedu.com ~/nginx-1.9.12]# ps -axu |grep nginx

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root      7191  0.0  0.0  44648  1164 ?        Ss   09:25   0:00 nginx: master process nginx

nginx     7192  0.0  0.1  45080  2004 ?        S    09:25   0:00 nginx: worker process


基本配置文件及目录

[root@10 nginx-1.9.12]# ll /etc/nginx/

total 60

-rw-r--r--. 1 root root 1077 Aug 15 13:13 fastcgi.conf

-rw-r--r--. 1 root root 1077 Aug 15 13:13 fastcgi.conf.default

-rw-r--r--. 1 root root 1007 Aug 15 13:13 fastcgi_params

-rw-r--r--. 1 root root 1007 Aug 15 13:13 fastcgi_params.default

-rw-r--r--. 1 root root 2837 Aug 15 13:13 koi-utf

-rw-r--r--. 1 root root 2223 Aug 15 13:13 koi-win

-rw-r--r--. 1 root root 3957 Aug 15 13:13 mime.types

-rw-r--r--. 1 root root 3957 Aug 15 13:13 mime.types.default

-rw-r--r--. 1 root root 2656 Aug 15 13:13 nginx.conf

-rw-r--r--. 1 root root 2656 Aug 15 13:13 nginx.conf.default

-rw-r--r--. 1 root root  636 Aug 15 13:13 scgi_params

-rw-r--r--. 1 root root  636 Aug 15 13:13 scgi_params.default

-rw-r--r--. 1 root root  664 Aug 15 13:13 uwsgi_params

-rw-r--r--. 1 root root  664 Aug 15 13:13 uwsgi_params.default


-rw-r--r--. 1 root root 3610 Aug 15 13:13 win-utf


四、配置文件

nginx的配置有着几个不同的上下文:main、http、server upstream和localtion、实现邮件和反向代理

配置的语法格式和定义凡事遵循C的风格,因此支持嵌套、还有逻辑清晰、易于常见、阅读和维护的优势。

nginx的代码事由一个核心和一系列的模块组成,核心主要用于提供web server的基本功能,以及web和mail反向代理的功能,用于启动网络协议,常见必要的运行时的环境即确保不同的模块之间的平滑交互,不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的,这些功能模块大致可以分为事件模块、阶段性处理器、输出处理器、变量处理器、协议、upstream和负载均衡几个类别,这个模块主要用于通过os独立事件的通知,协议模块负责实现nginx通过HTTP、tls、smtp、pop3与对用的客户端建立会话。

全局配置:

用于控制所有协议的属性。

协议配置:

http{

        server{

                location /url{

                    root /path/to/somewhere                   

               }    

        }

}

location和director的区别:

location用来控制URL,而director用来控制本地访问目录的。

1、核心模块(常用)

全局配置:

#user  nobody;

worker_processes  1;


#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;


#pid        logs/nginx.pid;



events {

    worker_connections  1024;

}


1、events{ }    用于定义事件,用于设定nginx工作模式和客户链接上限。

常用命令:

use:设定工作模式,自行完成,不需要设置

worker_connections:设定worker进程的用户连接数

2、worker_processes:用来设定worker进程的个数。

连接数=worker_process*worker_connections

3、worker_cpu_affinity:设置工作进程绑定在那个cpu上通过二进制表示,比如0010表示第二颗cpu。

4、worker_rlimit_nofile:表示一个工作进程可以打开的最大文件个数。默认为51200

可以通过/etc/securitys/limits.conf来设定

调整系统的默认最大文件句柄数:ulimit -n

通过文件修改:/etc/security/limits.conf

nginx nofile 51200

此方法适用于很多场景,这里也可以不用设置,因为nginx会自动修改系统默认值

5、worker_priority:设置nginx访问内核的优先级。

6、user:设置

7、error_log:定义日志文件存储位置。

error_log  file |stderr|syslog:server=address [debug|info|notice|warn|error|crit|alert|emerg]

实例:

error_log syslog:server=10.40.0.229,facility=local7,tag=nginx error

error_log  syslog:server=10.40.0.229,facility=local4  debug;

如果不加facility就是默认存放在message文件中。

实例:

user    nobody;

worker_processes  4;

worker_rlimit_nofile    51200;

error_log    syslog:server=10.40.0.229   notice;

events {

        use    epoll;

        worker_connections    51200;

}

2、http配置:

http {
: server {
: listen          80 default;
: server_name     _ *;
: access_log      logs/default.access.log main;
: location / {
: index index.html;
: root  /var/www/default/htdocs;
: }
: }
}

常用指令:

1、server:用来定义虚拟主机,最简单的配置方法就是定义listen、server_name、root。

    server{

        listen 10.40.0.227:8888;

        server_name localhost;

        root /var/tmp/nginx/;

        }


a、listen address:<port;>      //定义监听端口号码

b、root    </path>                 //定义网页路径,如果没有写绝对路径,那么相对路径指的是安装目录下的目录。

[root@localhost nginx-1.9.12]# ll /usr/local/nginx/html/

50x.html    index.html  


c、index    index,html        //定义默认访问的文件格式。

d、location    [=|~|~*|^~] url {}            //用在server和location中,定义URL路径属性。

=:精确匹配

~:模式匹配,区分大小写

~*:模式匹配,不区分大小写

^~:不被当前模式匹配,取反的意思。

=优先级最高,^~次之,模式匹配再次之,什么都没有最低。

官网样例演示:

        location = / {

[configuration A]

        }


                location / {

[configuration B]

        }

        location  /documents/ {

[configuration C]

        }

        location ^~ /images/  {

[configuration D]

        }

        location ~*\.(git|jpg|jpeg)$ {

[configuration E]

        }


请求“/”,匹配A

请求“/index.html”,匹配B

请求“/documents/document.html”,匹配C

请求“/images/1.gif”,匹配D

请求“documents/1.jpg”,匹配E

e、server name <hostname;> 定义虚拟主机名称

f、error_page <code> uri: 指定错误代码显示的网页内容,实验未成功。

    fastcgi_intercept_errors on;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }


        error_page  404    /404.html;

        location = /404.html {

                root /var/tmp/nginx/404.html;

        }

g、access,通过ip地址进行访问控制

locatin /{     

deny 10.40.0.55;

}


h、auth_base <authname>    通过用户名密码进行web登录管理

auth_basic_user_file 

[root@localhost ~]# htpasswd -c -m /etc/nginx/.htpasswd gongbing

New password: 

Re-type new password: 

Adding password for user gongbing


    server{

        listen 10.40.0.227:8888;

        server_name localhost;

        location /{

                root /var/tmp/nginx/;

                auth_basic "auth_login";

                auth_basic_user_file /etc/nginx/.htpasswd;

        }

     }

屏幕快照 2017-08-29 上午9.38.37.png

i、autoindex on 开启目录遍历功能,适用于下载。

j、add_header <name> <variable>自定义请求首部字段

    server{

        listen 10.40.0.227:8888;

        server_name localhost;

        location /{

                root /var/tmp/nginx/;

                auth_basic "auth_login";

                auth_basic_user_file /etc/nginx/.htpasswd;

                add_header X_src_server $server_addr;

        }

        }

屏幕快照 2017-08-29 上午11.04.57.png

k、rewrite regex replacement [last|break|redirect|permanent]

url地址重写功能,重定向。

可以通过if进行判断然后重写。

break和return来定义是否跳出当前判定或者循环。break是跳出,不检查

set可以自定义变量。

last:重启循环(判断)并在替换后再重新检查规则

break:匹配后停止并退出当前规则。

redirect:重定向到新路径,而不替换源路径,并重新检查。302,临时重定向

permanent:重定向到新路径,而不替换源路径,并重新检查。301,永久重定向

实例1:

[root@localhost ~]# tree /var/tmp/nginx/ 

/var/tmp/nginx/

├── client

├── fcig

├── forum

│   └── index.html

├── index.html

├── proxy

└── scgi


    server{

        listen 10.40.0.227:8888;

        index index.html;

        server_name localhost;

        location / {

                root /var/tmp/nginx/;

                index index.html;

                add_header X_src_server $server_addr;

                rewrite /bbs/(.*)$ /forum/$1 last;

                }

        }

2、http{ }

a、include mime.types;

b、default_type application/octet-stream;

c、log_format <logname> ‘$remote_addr - $remote_user [$time_local],”$request”’ ‘$status $body_bytes_send “$http_referer”’ ‘"$http_user_agent” “http_x_forwarded_for” ‘

用于记录日志文件的格式,主要是记录那些内容。

d、access_log path  format

     access_log syslog:server=address format

默认:access_log log/access.log combined;

e、keepalived_time  5 设置时长

3、if(condition){ } 条件判断语句,存在于rewrite模块中。应用领域是server、location模块中。

正则表达式模式匹配:

~:与指定的正则表达式模式匹配时返回“真”,判断匹配时区分大小写。

~*:与指定的正则表达式模式匹配时返回“真”,判断匹配时不区分大小写。

!~:与指定的正则表达式模式不匹配时返回“真”,判断匹配时区分大小写。

!~*:与指定的正则表达式模式不匹配时返回“真”,判断匹配时不区分大小写。

文件及目录匹配判断:

-f,!-f:判断指定的路径是否存在且为文件。

-d,!-d:判断指定的路径是否存在且为目录。

-e,!-e:判断指定的路径是否存在,文件或目录均可。

-x,!-x:判断指定的路径是否存在且为可执行文件。

实例:

a、判断请求报文是以jpg、png、gif结尾的uri连接。

        If ($request_uri ~* \.(jpg|png|gif)$){

}


        location ~* \.(jpg|png|gif)$){

}


b、判断请求的主机是www.magedu.com的报文。

if ($host = “www.magedu.com”) {

}

4、stub_status 启动nginx的状态监控模块,定义在server模块中。

        locatin /status123 {

                stub_status on;

access_log off;

                }

active connecttions:对后端发起的活动连接数

Server accepts handled requests:

420已处理过的连接

420成功创建的握手

455表示处理的请求数

reading:读取到客户端的header信息数

writing:返回给客户端的header信息数

waiting:开启keep-alive的情况下,等于active-(reading+writing)


5、gzip 压缩页面数据,有利于传输提速。

gzip on|off;

gzip_buffers number size;




本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968805,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
128 1
|
7月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,它在网络编程技术领域中被广泛应用。本文将详细介绍Nginx的概念和实践,包括其核心原理、功能特点、优势和应用场景等方面。同时,还将深入探讨如何使用Nginx进行高性能网络编程,结合实际案例进行分析。
|
27天前
|
负载均衡 应用服务中间件 数据库
Nginx负载过高,加机器就能解决吗?
一个架构难题的剖析:A机器顶不住,加B机器就能解决吗?
37 7
|
6月前
|
Ubuntu 前端开发 JavaScript
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
|
3月前
|
负载均衡 前端开发 应用服务中间件
前后端分离技术与NGINX的简单使用
前后端分离技术与NGINX的简单使用
|
2月前
|
缓存 负载均衡 应用服务中间件
解决Nginx常见问题的技术指南
解决Nginx常见问题的技术指南
212 0
|
5月前
|
负载均衡 网络协议 应用服务中间件
Nginx负载配置
Nginx负载配置
85 8
|
6月前
|
缓存 负载均衡 应用服务中间件
技术笔记:Nginx配置详解
技术笔记:Nginx配置详解
38 0
|
6月前
|
负载均衡 前端开发 应用服务中间件
技术好文共享:超详细的Nginx简易教程
技术好文共享:超详细的Nginx简易教程
|
6月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用