用脑思考,用心琢磨,用行动证实 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

Nginx分享简记

环境配置 memory 发布于November 5, 2017 标签: Nginx

根据W3techs的统计,Nginx应该是目录最受欢迎的WEB服务器

同时,它也是增长最快的服务器软件。
所以有了这篇文章

nginx

nginx是一个高性能的 HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器 (都这样说,反正我只用过它的http和反向代理)

常用的WEB服务器的工作模式

Web服务器要为用户提供服务,必须以某种方式,工作在某个套接字上。一般Web服务器在处理用户请求是,一般有如下三种方式可选择:多进程方式多线程方式异步方式

**多进程方式**:为每个请求启动一个进程来处理。由于在操作系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,当负载高是,性能会明显降低。

优点: 稳定性!由于采用独立进程处理独立请求,而进程之间是独立的,单个进程问题不会影响其他进程,因此稳定性最好。
缺点: 资源占用!当请求过大时,需要大量的进程处理请求,进程生成、切换开销很大,而且进程间资源是独立的,造成内存重复利用。

**多线程方式**:一个进程中用多个线程处理用户请求。由于线程开销明显小于进程,而且部分资源还可以共享,因此效率较高。

优点:开销较小!线程间部分数据是共享的,且线程生成与线程间的切换所需资源开销比进程间切换小得多。
缺点:稳定性!线程切换过快可能造成线程抖动,且线程过多会造成服务器不稳定。

**异步方式**:使用非阻塞方式处理请求,是三种方式中开销最小的。但异步方式虽然效率高,但要求也高,因为多任务之间的调度如果出现问题,就可能出现整体故障,因此使用异步工作的,一般是一些功能相对简单,但却符合服务器任务调度、且代码中没有影响调度的错误代码存在的程序。

优点:性能最好!一个进程或线程处理多个请求,不需要额外开销,性能最好,资源占用最低。
缺点:稳定性!某个进程或线程出错,可能导致大量请求无法处理,甚至导致整个服务宕机。

一个Web请求的处理过程

客户发起情况到服务器网卡;
服务器网卡接受到请求后转交给内核处理;
内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程
Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)
内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘
内核调度磁盘,获取需要的资源
内核将资源存放在自己的缓冲区中,并通知Web服务器进程
Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中
Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求
内核将响应发送至网卡
网卡发送响应给用户

简单来说就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户

通过上面的对连接的处理分析,我们知道工作在用户空间的web服务器进程是无法直接操作IO的,需要通过系统调用进行。

安装篇

基础环境

nginx是C语言开发,所以你需要安装c语言相关的编译工具GCC

yum install -y gcc

nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库(注意:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库)

yum install pcre pcre-devel

nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库

yum install -y zlib zlib-devel

nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

yum install -y openssl openssl-devel

编译及安装

下载解压不多说

./configure --prefix=/usr/local/nginx

先默认安装,后面我们熟悉了之后,再来折腾其它的参数。可以通过./configure --help查看相关参数 以--without开头的都默认安装。
--prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
--conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
--user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似
--with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
--with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
--with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--with-http_stub_status_module : 用来监控 Nginx 的当前状态
--with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
--add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

预编译不报错就直接make啦

make && make install

Nginx的启动及关闭

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload
/usr/local/nginx/sbin/nginx -s stop //相当于kill
/usr/local/nginx/sbin/nginx -s quit //等待执行完退出

修改配置之类的之后,可以使用

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

进行配置文件的检测。以便影响线上业务

nginx.conf的一些备书....

注意事项
1.client_max_body_size 10m; 上传大小设置
2.worker_connections; 尽可能的根据业务需求调整。
3.静态文件的缓存过期时间 expires
4.更多可以参考 https://www.lvtao.net/server/1458.html

#运行用户
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;
        server_name  www.lvtao.net;

        #定义服务器的默认网站根目录位置
        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;
        }

        #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;
        }

    }
}

内置变量 (与apache一致)

server 相关

listen 80;主机的端口 default_server; 默认主机
server_name ;域名. _ ,*.lvtao.net,lvtao.* 也可以写正则, 有兴趣的自己玩。反正我没搞过...

location 相关,此段表示 为某个URI建议配置

  1. =号修饰符 (必须精确匹配,不能使用正则。)
location = /hi {
}
/hi可用(严格匹配)
/Hi 未必可用,取决于系统是否支持区分大小写
/hi?m=index 可用(忽略参数)
/hi/ 不可用 (结尾有斜杠)
/hiTao 不可用 (名称不匹配了,有额外字符)

2.无修饰符 (指定模式开始,不能使用正则。)

location /hi {
}
/hi 可用
/Hi 未必可用
/hi?m=index 可用
/hi/ 可用
/hiTao 可用

3.~修饰符 (匹配正则表达式,且区分大小写)

location ~ ^/hi$ {
}
/hi 可用
/Hi 不可用
/hi?m=index 可用
/hi/ 不可用
/hiTao 不可用

4.~* 修饰符 (指定正则表达式,不区分大小写)

location ~* ^/hi$ {
}
/hi 可用
/Hi 可用
/hi?m=index 可用
/hi/ 不可用
/hiTao 不可用

5.^~修饰符 (如果以^~开头,则不再检查正则表达式)

6.@修饰符 (定义命令location段,这些区段客户端不能访问,只能由内部产生访问请求)

优先级 =>无修饰符(精准)>^~>~或~*>无修饰符(符合指定模式的)

思考:

location ~* ^/document$ {}

location /doc {}

http://.../doc
http://.../docu
http://.../document
http://.../document/

rewrite 模块 (允许正则替换URI,返回页面重新定向或根据条件选择配置)

break 停止处理当前这一轮的rewrite指定集
return 停止并返回指定code给客户端
set 为指定变量设置值
if 条件判断

变量名;如果变量值为空或是以0开始的字符串,则条件为假;
使用=或!=比较变量和字符串
使用~或~*来匹配正则表达式
使用-f或!-f来判断文件是否存在
使用-d或!-d来判断目录是否存在
使用-e或!-e来判断文件、目录、符号链接是否存在
使用-x或!-x来检查是否可执行

rewrite regex replacement flag
flag参数

last 停止执行当前的执念,然后查找匹配变更后的新的location
break 停止执行,开始新的一轮
redirect 以http或https开头的时候,返回状态码为302
permanent 返回为301

rewirte ^/info/(.*)$ /user_info?username=$1;
location /user_info {
echo "$uri";
echo "$args";
}

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1308篇
  • 用户评论:687条
  • 开博至今:3976天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字幕
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或多个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • memory: 这是我3年前玩过一次,当时因为安装完后,发现日常办公还好,但是好...
  • sdf: 想问一下,激活工具激活后,后面会出现提示要再次重新激活吗?
  • memory: 你要用碗装我吗?还是要我把扔的扔进你碗里???!!! &^_^&
  • 薛才杰: 同感,快扔到我的碗里来。。。
  • memory: 要说明一下,在大陆及香港的云主机或VPS,都是不支持的。原因都懂...
  • 历史趣谈LishiQtan: 很好的文章,值得收藏
  • memory: 现在回头看,,,这么烂的代码,也是醉了.
  • memory: 有空试试apache的
  • 脚踏实地: rInfo数组是怎么来的
  • 朋友们: 我都是这么建站的
  • memory: 明眼人.
  • 上官元恒: $lunarInfo数组是怎么来的,这是重点
  • memory: 你知道的太多了...
  • yjl: 这个肯定解决的不是空间的问题,可能是复用的问题,有可能是“站群”的问题
  • Smithd994: Hello! This post could not be wr...
  • memory: controll文件assign ,然后模板文件中直接foreach
  • mike: 你好,yaf怎么使用循环输出数据到模板中