Nginx 安装 配置及常见问题及一些常见报错。

中文文档:http://www.nginx.cn/doc/

 

Nginx简介:

与Apache(httpd)类似,是一个开源的,支持高性能、高并发的www服务和代理服务软件,由俄罗斯人IgorSyoer开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上,后来作者将源代码以类BSD许可的形式开源出来供全球使用

在功能应用方面,Nginx不但是一个优秀的Web服务软件,还是具有反向代理,负载均衡功能和缓存功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS、HAproxy等专业代理软件,但Ngix部署起来更为简单、方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件

 

Nginx软件使用排名参见:https://news.netcraft.com/

Nginx 安装 配置及常见问题及一些常见报错。

Nginx的重要特性及应用场合:

  • 可针对静态资源高速高并发访问和缓存
  • 可使用反向代理加速,并且健康检查和容错功能
  • 支持FastCGI、Uwsgi、SCGI、Memcached加速和缓存
  • 支持SSL、TLS、SNI
  • 具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked 响应、XSLT、SSI及图像缩放等功能,在SSI过滤器中,一个包含多个SSI的页面,如果经过由FastCGI或反向代理处理,可被并行处理

 

它所具备的其它WWW服务软件特性:

  • 支持基于域名、端口、IP的多虚拟主机站点
  • 支持keepalived和pipelined连接
  • 可进行简单、方便、灵活的配置和管理
  • 支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问
  • 可自定义日志格式、临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志
  • 可以利用信号控制Nginx进程
  • 支持3xxx-5xxxHTTP状态码重定向
  • 支持rewrite模块,支持URI重写及正则表达式匹配
  • 支持基于客户端IP地址和HTTP基本认证的访问控制
  • 支付PUT、DELETE、MKCOL、COP、及MOVE等特殊的HTTP请求方法
  • 支付FLV流和MP4流技术产品应用
  • 支持HTTP响应速率限制
  • 支持同一IP地址的并发连接或请求数限制
  • 支付邮件服务代理

 

Nginx在企业的功能应用:

  • 作为web服务软件:Nginx是一个支持高性能、高并发的Web服务软件,它具体有很多优秀的特性,与Apache相比,Nginx占资源更少,效果更高,功能更强
  • 作为反向代理或负载均衡,充当LVS或HA-proxy
  • 前端业务数据缓存服务:在web缓存方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业前端缓存功能

 

为什么Nginx比Apache性能高:

Nginx使用最新的epoll(Linux2.6内核)和kqueue(FeeBSD)异步网络I/O模型,而Apache使用的是传统的select模型,目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epool模型

 

apache select和Nginx epoll的技术对比:

指标

select

epoll

 

随着连接数增加性能下降

随着连接数增加,性能基本上没下降

连接数

连接数有限,最大数不能超过1024,超过1024,则需要修改FD_SETSIZE宏,重新编译

连接数无限制

内存处理机制

线性轮询

回调callback

开发复杂性

 

 

 

下载安装:

Nginx软件有三种版本:稳定版、开发版和历史稳定版

下载: wgethttp://nginx.org/download/nginx-1.12.1.tar.gz

 

检查环境:

cat /etc/redhat-release 查看系统版本

uname -r 查看内核版本

关闭firewall、selinux

安装依赖包:

检查是否已安装pcre、pcre-devel包:

rpm -qa pcre-devel pcre

如果没有刚安装:

yum install -y pcre pcre-devel

检查是否已安装openssl、openssl-devel包 :

rpm -qa openssl-devel openssl

如果没有刚安装:

yum install -y openssl openssl-devel

 

创建nginx用户:

useradd nginx -s /sbin/nologin -M

编译和安装:

  1. 解压:tar -zxvf nginx-1.12.2.tar.gz
  2. 一般将tar包放在/usr/local下 解压完成后 cd至nginx-1.12.2目录下进行编译
  3. 配置编译参数:./configure --prefix=/usr/local/nginx-1.12.2 --conf-path=/usr/local/nginx-1.12.2/nginx.conf --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  --without-http_rewrite_module  --without-http_gzip_module(要开启gzip就不要加这一条)   --with-pcre(前后端或者动静分离加这条) (改掉版本号 1.12.2改成对应的)
  4. 编译:make
  5. 安装:make install
  6. 启动nginx: /usr/local/nginx-1.12.2/sbin/nginx
  7. 检察进程和端口是否监听:ps -ef | grep nginx netstat -tunlp | grep 80 或 ss -tunlp | grep 80
  8. 访问测试:curl http://localhost:80 或 wget http://localhost:80

nginx命令其它用法:

  • 启动nginx服务: ./nginx
  • 检查配置文件是否正确 ./nginx -t
  • 停止服务 ./nginx -s stop
  • 重启服务 ./nginx -s restart
  • 重新加载配置文件 ./nginx -s reload

 

Nignx启动的疑难杂症:

  • 编译安装pcre软件包时,gcc未安装完整报错
  • Nginx用户没创建导致报错:"nginx:[emerg] getpwnam("nginx") failed"
  • 防火墙和selinux未关闭导致访问不到nginx页面

 

 

部署一个站点:

Nginx的默认站点目录是Nginx安装目录上的html目录,如果要部署一个网站,把开发好的程序放全部到html目录下即可

 

 

 

Nginx技术深入剖析:

Nginx模块说明:

Nginx之所以功能强大,是因为它有众多功能模块,以下是常用的模块

Nginx http功能相关模块

模块说明

ngx_http_core_module

包括一些核心的http参数配置,对应Nginxr的配置为http区块部分

ngx_http_access_module

访问控制模块,用来控制网站用户对Nginx的访问

   
   
   

在生产环境中,配置、调整及优化Nginx软件,主要就是根据这些模块的功能修改应用的参数来实现

 

 

nginx负载均衡的5种策略

http://172.18.14.71/erp/

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver {

server 192.168.0.14;

server 192.168.0.15;

}

2、加权轮询

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backserver {

server 192.168.0.14 weight=5;

server 192.168.0.15 weight=10;

}

3、IP绑定 ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {

ip_hash;

server 192.168.0.14:88;

server 192.168.0.15:80;

}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {

server server1;

server server2;

fair;

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backserver {

server squid1:3128;

server squid2:3128;

hash $request_uri;

hash_method crc32;

}

在需要使用负载均衡的server中增加

proxy_pass http://backserver/;

upstream backserver{

ip_hash;

server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)

server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)

server 127.0.0.1:6060;

server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)

}

max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义

 

location块:

如果要精确查找:

 location /XXXXXXX {
            root   /home/qmkx/html;
            index  XXXXXX.html;
        }
直接将XXX改一个别的名字   然后 将后面目录 及html 改为另外一个即可

 

 

根据参数优化Nginx服务性能

配置worker进行个数:

worker_processes: 默认值为1, 官方建议设置为CPU核数。其实在一些高流量高并发场合可以将其设置为 CPU核数*2,我一般使用4

 

上传文件大小的限制:

client_max_body_size参数设置最大允许的客户端请求主体大小,在请求头中有"Content-Length"决定,如果超过了此配置值,服务器端会给浏览器返回413错误,意思就请求条目过大

 

 

使用Nginx zip压缩实现性能优化:

用户请求的内容在服务端发送给浏览器时,Nginx服务器会根据一些具体策略实施压缩。以节约带宽,同时加快响应速度来提升用户体验

Nginx的压缩与Apache的压缩功能很相似,Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装

Nginx 安装 配置及常见问题及一些常见报错。

允许重新定义或者添加发往后端服务器的请求头:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

 

一些不对劲的东西(报错):

···在根据生产环境改完nginx.conf后,先使用nginx -t检查 如果出现以下报错:

nginx: the configuration file /usr/local/nginx-1.12.2/nginx.conf syntax is ok

nginx: [emerg] mkdir() "/var/temp/nginx/client" failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx-1.12.2/nginx.conf test failed

如果在nginx -t 时遇见这个 直接用root权限的角色创建文件夹即可。

root:mkdir -p /var/temp/nginx/client

如果生产环境不允许使用root那么增加sudo即可

biubiubiu: sudo mkdir -p /var/temp/nginx/client·····如果在配置反向代理proxy_pass及upstream的时候 遇见[emerg] "proxy_pass" directive is not allowed here in /etc/nginx/nginx.conf第一先查看是不是编译的时候没将模块加入 如果加入模块 那就是位置的问题 proxy_pass必须要放在http{}中 我一般将它放在location / {的下一行 upstram我一般将它放在http{的下一行 然后重启即可

 

 

 

 

 

<未完待续,持续更新>