关于nginx:nginx心得

nginx简介(参考百度)

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0公布于2004年10月4日。

其将源代码以类BSD许可证的模式公布,因它的稳定性、丰盛的功能集、示例配置文件和低系统资源的耗费而闻名。2011年6月1日,nginx 1.0.4公布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中体现较好,中国大陆应用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝
等。

nginx装置

  • 1.装置编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
  • 2.装置 PCRE
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
  • 3.装置Nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.6.2.tar.gz

参考(https://www.runoob.com/linux/…)

nginx根本构造

高度模块化的设计是 Nginx 的架构根底。Nginx 服务器被合成为多个模块,每个模块就是一个功能模块,只负责本身的性能,模块之间严格遵循“高内聚,低耦合”的准则

  • 外围模块

外围模块是 Nginx 服务器失常运行必不可少的模块,提供谬误日志记录、配置文件解析、事件驱动机制、过程治理等外围性能。

  • 规范 HTTP 模块

规范 HTTP 模块提供 HTTP 协定解析相干的性能,如:端口配置、网页编码设置、HTTP 响应头设置等。

  • 可选 HTTP 模块

可选 HTTP 模块次要用于扩大规范的 HTTP 性能,让 Nginx 能解决一些非凡的服务,如:Flash 多媒体传输、解析 GeoIP 申请、SSL 反对等。

  • 邮件服务模块

邮件服务模块次要用于反对 Nginx 的邮件服务,包含对 POP3 协定、IMAP 协定和 SMTP 协定的反对。

  • 第三方模块

第三方模块是为了扩大 Nginx 服务器利用,实现开发者自定义性能,如:Json 反对、Lua 反对等。
参考(https://www.sohu.com/a/230364…)

nginx基本功能

  • web服务器、反向代理服务器
  • 负载平衡
  • 动静拆散

nginx长处

  • 1.能够高并发连贯

官网测试Nginx可能撑持5万并发连贯,理论生产环境中能够撑持2~4万并发连接数。

起因,次要是Nginx应用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache应用的是传统的Select模型,其比较稳定的Prefork模式为多过程模式,须要常常派生子过程,所以耗费的CPU等服务器资源,要比Nginx高很多。

  • 2.内存耗费少

Nginx+PHP(FastCGI)服务器,在3万并发连贯下,开启10个Nginx过程耗费150MB内存,15MB*10=150MB,开启的64个PHP-CGI过程耗费1280内存,20MB*64=1280MB,加上零碎本身耗费的内存,总共耗费不到2GB的内存。

如果服务器的内存比拟小,齐全能够只开启25个PHP-CGI过程,这样PHP-CGI耗费的总内存数才500MB。

+3.老本低廉
购买F5BIG-IP、NetScaler等硬件负载平衡交换机,须要十多万到几十万人民币,而Nginx为开源软件,采纳的是2-clause BSD-like协定,能够收费试用,并且可用于商业用途。

BSD开源协定是一个给使用者很大自在的协定,协定指出能够自在应用、批改源代码、也能够将批改后的代码作为开源或专用软件再公布。

  • 4.配置文件非常简单

网络和程序一样通俗易懂,即便,非专用系统管理员也能看懂。

  • 5.反对Rewrite重写

可能依据域名、URL的不同,将http申请分到不同的后端服务器群组。

  • 6.内置的健康检查性能

如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的拜访。

  • 7.节俭带宽

反对GZIP压缩,能够增加浏览器本地缓存的Header头。

  • 8.稳定性高

用于反向代理,宕机的概率微不足道。

  • 9.反对热部署

Nginx反对热部署,它的主动特地容易,并且,简直能够7天*24小时不间断的运行,即便,运行数个月也不须要重新启动,还可能在不间断服务的状况下,对软件版本进行降级。

nginx毛病

  • 1.动静解决差:nginx解决动态文件好,消耗内存少,然而解决动静页面则很鸡肋,当初个别前端用nginx作为反向代理抗住压力,apache作为后端解决动静申请。
  • 2.rewrite弱:尽管nginx反对rewrite性能,然而相比于Apache来说,Apache比nginx 的rewrite 弱小。
  • 3.Nginx仅能反对http、https和Email协定,这样就在适用范围下面小些,这个是它的毛病
  • 4.对后端服务器的健康检查,只反对通过端口来检测,不反对通过url来检测不反对Session的间接放弃,但能通过ip_hash来解决

nginx配置

  • 全局
#Nginx的worker过程运行用户以及用户组
#user  nobody nobody;
#Nginx开启的过程数
worker_processes  1;
#worker_processes auto;
#以下参数指定了哪个cpu调配给哪个过程,一般来说不必非凡指定。如果肯定要设的话,用0和1指定调配形式.
#这样设就是给1-4个过程调配独自的核来运行,呈现第5个过程是就是随机调配了。eg:
#worker_processes 4     #4核CPU 
#worker_cpu_affinity 0001 0010 0100 1000;
nets    
#定义全局谬误日志定义类型,[debug|info|notice|warn|crit]
#error_log  logs/error.log  info;
#指定过程ID存储文件地位
#pid        logs/nginx.pid;
#一个nginx过程关上的最多文件描述符数目,理论值应该是最多关上文件数(ulimit -n)与nginx过程数相除,然而nginx调配申请并不是那么平均,所以最好与ulimit -n的值保持一致。
#vim /etc/security/limits.conf
#  *                soft    nproc          65535
#  *                hard    nproc          65535
#  *                soft    nofile         65535
#  *                hard    nofile         65535
worker_rlimit_nofile 65535;
  • events 事件配置
events {
    #use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD下面,就用kqueue模型。
    use epoll;
    #每个过程能够解决的最大连接数,实践上每台nginx服务器的最大连接数为worker_processes*worker_connections。理论值:worker_rlimit_nofile/worker_processes
    #留神:最大客户数也由零碎的可用socket连接数限度(~ 64K),所以设置不切实际的高没什么益处
    worker_connections  65535;    
    #worker工作形式:串行(肯定水平升高负载,但服务器吞吐量大时,敞开应用并行形式)
    #multi_accept on; 
}
  • 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"';
    #定义日志的格局。前面定义要输入的内容。
    #1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
    #2.$remote_user :用来记录客户端用户名称;
    #3.$time_local :用来记录拜访工夫与时区;
    #4.$request  :用来记录申请的url与http协定;
    #5.$status :用来记录申请状态; 
    #6.$body_bytes_sent :记录发送给客户端文件主体内容大小;
    #7.$http_referer :用来记录从那个页面链接拜访过去的;
    #8.$http_user_agent :记录客户端浏览器的相干信息
    #连贯日志的门路,指定的日志格局放在最初。
    #access_log  logs/access.log  main;
    #只记录更为严重的谬误日志,缩小IO压力
    error_log logs/error.log crit;
    #敞开日志
    #access_log  off;
 
    #默认编码
    #charset utf-8;
    #服务器名字的hash表大小
    server_names_hash_bucket_size 128;
    #客户端申请单个文件的最大字节数
    client_max_body_size 8m;
    #指定来自客户端申请头的hearerbuffer大小
    client_header_buffer_size 32k;
    #指定客户端申请中较大的音讯头的缓存最大数量和大小。
    large_client_header_buffers 4 64k;
    #开启高效传输模式。
    sendfile on;
    #防止网络阻塞
    tcp_nopush on;
    tcp_nodelay on;    
    #客户端连贯超时工夫,单位是秒
    keepalive_timeout 60;
    #客户端申请头读取超时工夫
    client_header_timeout 10;
    #设置客户端申请主体读取超时工夫
    client_body_timeout 10;
    #响应客户端超时工夫
    send_timeout 10;
 
#FastCGI相干参数是为了改善网站的性能:缩小资源占用,进步访问速度。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
 
#gzip模块设置
    #开启gzip压缩输入
    gzip on; 
    #最小压缩文件大小
    gzip_min_length 1k; 
    #压缩缓冲区
    gzip_buffers 4 16k;
    #压缩版本(默认1.1,前端如果是squid2.5请应用1.0)
    gzip_http_version 1.0;
    #压缩等级 1-9 等级越高,压缩成果越好,节约宽带,但CPU耗费大
    gzip_comp_level 2;
    #压缩类型,默认就曾经蕴含text/html,所以上面就不必再写了,写上去也不会有问题,然而会有一个warn。
    gzip_types text/plain application/x-javascript text/css application/xml;
    #前端缓存服务器缓存通过压缩的页面
    gzip_vary on;
  • server(虚拟主机根底设置)
#虚拟主机定义
    server {
        #监听端口
        listen       80;
        #拜访域名
        server_name  localhost;
        #编码格局,若网页格局与此不同,将被主动转码
        #charset koi8-r;
        #虚拟主机拜访日志定义
        #access_log  logs/host.access.log  main;
        #对URL进行匹配
        location / {
            #拜访门路,可绝对也可绝对路径
            root   html;
            #首页文件。以下按程序匹配
            index  index.html index.htm;
        }
 
  • 负载平衡
#负载平衡服务器池
upstream my_server_pool {
    #调度算法
    #1.轮循(默认)(weight轮循权值)
    #2.ip_hash:依据每个申请拜访IP的hash后果调配。(会话放弃)
    #3.fair:依据后端服务器响应工夫最短申请。(upstream_fair模块)
    #4.url_hash:依据拜访的url的hash后果调配。(需hash软件包)
    #参数:
    #down:示意不参加负载平衡
    #backup:备份服务器
    #max_fails:容许最大申请谬误次数
    #fail_timeout:申请失败后暂停服务工夫。
    server 192.168.1.109:80 weight=1 max_fails=2 fail_timeout=30;
    server 192.168.1.108:80 weight=2 max_fails=2 fail_timeout=30;
}
#负载平衡调用
server {
    ...
    location / {
    proxy_pass http://my_server_pool;
    }
}
  • location定位
#依据不同的浏览器URL重写
if($http_user_agent ~ Firefox){
rewrite ^(.*)$  /firefox/$1 break; 
}
if($http_user_agent ~ MSIE){
rewrite ^(.*)$  /msie/$1 break; 
}
 
#实现域名跳转
location / {
    rewrite ^/(.*)$ https://web8.example.com$1 permanent;
}
  • IP限度
#限度IP拜访
location / {
    deny 192.168.0.2;
    allow 192.168.0.0/24;
    allow 192.168.1.1;
    deny all;
}

nginx内置变量


nginx常用命令

  • 启动进入sbin ./nginx
  • 查看ngix语法测试是否通过 ./nginx -t
  • 重启 ./nginx -s reload
  • 查看nginx是否启动 ps -ef | grep nginx
  • 敞开nginx ./nginx -s stop
  • 关联配置 ./nginx -c xx.conf

nginx注意事项

1.Nginx在上传文件时呈现413 Request Entity Too Large,怎么办?

因为Nginx默认反对上传1MB的文件,所以超过1MB则会报错。

#nginx上传文件大小限度配置语法  
Syntax: client\_max\_body\_size size;  
Default: client\_max\_body\_size 1m;  
Context: http, server, location  
容许该server能反对上传200m的文件,也能够其配置放入http层,所有server都失效。  
server {  
...  
 client\_max\_body\_size 200m;  
...  
}

2.Nginx指定门路时,root与alias区别在哪?

root与alias门路匹配次要区别在于nginx如何解释location前面的uri,这会使两者别离以不同的形式将申请映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。

root的处理结果是:root门路+location门路
alias的处理结果是:应用alias门路替换location门路

1.root门路配置实例: 用户拜访www.xuliangwei.com/image/test.gif,实际上Nginx会上/code/image/目录下找去找test.gif文件

server {  
 listen 80;  
 server\_name www.xuliangwei.com;  
 location /image/ {  
 root /code;  
 }  
}

3.400 bad request

个别起因:申请的Header过大。 解决办法:配置nginx.conf相干设置

`client_header_buffer_size 16k;`
`large_client_header_buffers 4 64k;`

4.403 forbiden
个别是拜访文件权限不够

5.413 Request Entity Too Large

个别起因:个别呈现在上传文件。 解决办法:配置nginx.conf相干设置,配置php.ini如下(必须和nginx.conf配置统一)

client_max_body_size 10m;

post_max_size=10M

upload_max_filesize=2M

 499 Client Closed Request

个别起因:客户端在为等到服务器相应返回前就敞开了客户端描述符。个别呈现在客户端设置超时后,被动敞开socket.

解决办法:依据理论Nginx后端服务器的解决工夫批改客户端超时工夫。

 > 6.500 Internal Server Rrror

个别起因:脚本谬误,(php语法错误、lua语法错误)

拜访量过大,系统资源限度,不能关上过多文件
磁盘空间有余。(access log开启可能导致磁盘满溢 敞开)

 > 7.502 Bad Gateway、503 Serveice Unavailable

个别起因:后端服务无奈解决,业务中断。
解决办法:从后端日志获取谬误起因,解决后端服务器问题。

 > 8.504 Gateway Timeout

个别起因:后端服务器在超时工夫内,未响应Nginx代理申请
解决办法:依据后端服务器理论解决状况,调正后端申请超时工夫。
proxy_read_timeout 90;
proxy_send_timeout 90;

参考(https://www.cnblogs.com/johnn…)
参考(https://blog.csdn.net/lzghxjt…)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理