2019-07-07-Nginx.md

titledatetags
Nginx
2019-07-07 13:33:00 -0700

img

Nginx安装

Ubuntu 16.04.3系统

安装编译需要的库和工具

apt-get update
apt-get install build-essential libtool gcc automake autoconf make

编译安装openssl-1.0.0a

wget http://www.openssl.org/source/openssl-1.0.0a.tar.gz
tar zxvf openssl-1.0.0a.tar.gz -C /usr/local/
cd /usr/local/openssl-1.0.0a
./config
make
make install

编译安装pcre-8.38

wget https://ftp.pcre.org/pub/pcre/pcre-8.38.tar.gz
tar zxf pcre-8.38.tar.gz -C /usr/local
cd /usr/local/pcre-8.38
./configure
make
make install

编译安装zlib-1.2.11

wget https://download.videolan.org/contrib/zlib/zlib-1.2.11.tar.gz

tar zxf zlib-1.2.11.tar.gz -C /usr/local
cd /usr/local/zlib-1.2.11
./configure
make
make install

安装nginx-1.15.5

wget http://nginx.org/download/nginx-1.15.5.tar.gz
tar zxf nginx-1.15.5.tar.gz -C /usr/local
cd /usr/local/nginx-1.15.5

./configure --prefix=/usr/local/nginx --with-stream --with-http_realip_module --with-http_sub_module --with-http_flv_module --with-http_dav_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_addition_module --with-pcre=/usr/local/pcre-8.38 --with-openssl=/usr/local/openssl-1.0.0a --with-http_ssl_module --with-zlib=/usr/local/zlib-1.2.11

make
make install

Nginx配置文件详解

main	#全局设置
events {
  #nginx工作模式
}
http {
  #http设置
  
  server {
  #主机设置
  		}
  				
  location {
  #URL匹配
  		}
  				
  upstream {
  #负载均衡服务器配置
			}
}

Main模块

相当于服务的全局设置,当子模块中与main模块中均存在的参数,优先读取子模块值。

#user  nobody nobody;							
worker_processes  6;				

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

pid        logs/nginx.pid;

worker_rlimit_nofile 65535;
  • user 指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。

  • error_log 定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。

  • pid

    用来指定进程id的存储文件位置。

  • worker_processes 在配置文件顶级部分,定义worker角色的工作进程个数,由master进程接收并分配请求给worker处理。通常此数为机器的线程数,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。

  • worker_cpu_affinity 也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)

  • worker_rlimit_nofile 写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535。

    Events模块

    定义nginx的工作模式及连接数上限。

events {
    use epoll;
    worker_connections  1024;
}
  • use epoll

    写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。

  • worker_connections 写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。

Http模块

提供http服务相关属性配置,包含server及upstream模块。

http{
    include       mime.types;
    include				conf.d/*.conf
    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  /usr/local/var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  10;
    #gzip  on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}
  • include 用来设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型,另一种方式为指定读取包含某目录下的某些文件。
  • default_type 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置asp 的locate 环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载了。
  • log_format 用于设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来记录这种类型。 main的类型日志如下:也可以增删部分参数。
127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"
  • access_log 用来纪录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_formatmain
  • sendfile 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
  • keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。

Server模块

定义虚拟主机,包含location子模块。

server {
        listen       8080;
        server_name  localhost 192.168.12.10 www.yangyi.com;
        # 全局定义,如果都是这一个目录,这样定义最简单。
        root   /Users/yangyi/www;
        index  index.php index.html index.htm; 
        charset utf-8;
        access_log  usr/local/var/log/host.access.log  main;
        aerror_log  usr/local/var/log/host.error.log  error;
        ....
}
  • server 标志定义虚拟主机开始。
  • listen 用于指定虚拟主机的服务端口。
  • server_name 用来指定IP地址或者域名,多个域名之间用空格分开。
  • root 表示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来。
  • index 全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来。
  • charset 用于设置网页的默认编码格式。
  • access_log 用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。

Location模块

localtion模块是根据不同项目经常需要调整配置的模块,支持正则匹配、条件判断匹配等,典型例子有动态分离处理。

location / {
            root   html;
            index  index.php index.html index.htm;
        }
  • location / 表示匹配访问根目录。
  • root 指令用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对路径是相对于nginx的安装目录)。也可以是绝对路径。
  • index 用于设定我们只输入域名后访问的默认首页地址,有个先后顺序:index.php index.html index.htm,如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。

location 正则匹配格式:location ~。后面加个~

location ~ \.php$ {
           root /var/deploy/client/;
           include fastcgi_params;
           fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
           fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
  • \.php$ 熟悉正则的我们直到,这是匹配.php结尾的URL,用来解析php文件。里面的root也是一样,用来表示虚拟主机的根目录。
  • fast_pass 链接的是php-fpm 的地址,需要注意的是此处的unix地址一定要与php listen /var/run/php/php7.2-fpm.sock保持一致。

Upstream模块

upstream模块是负责负载均衡配置,通过调度算法实现客户端ip到后端服务器的负载均衡

upstream study.com {
    ip_hash;
    server 192.168.0.129:80;
    server 192.168.0.179:80 down;
    server 192.168.0.180:8080  max_fails=3  fail_timeout=20s;
    server 192.168.0.190:8080;
}
  • upstream 后紧跟标示名称用于proxy_pass,通常此值以服务类别或域名命名。

  • 负载均衡调度算法

    1. ip_hash 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
    2. weight (默认方式)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
    3. fair 比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
    4. url_hash 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
      • down 表示当前的server暂时不参与负载均衡。
      • backup 预留备份的机器,当所有可用服务器都出现故障后,才会请求此类别服务器。
      • max_fails 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误
      • fail_timeout 当max_fails次失败后,暂停服务的时间。max_fails可以与fail_timeout一起使用。

    注意:当调度方式为ip_hash时,后端服务器在负载均衡中的状态不能时weight和backup。

启停Nginx

/usr/local/nginx/sbin/nginx	-t #测试配置文件可用性 -c 指定配置文件
/usr/local/nginx/sbin/nginx 	#启动nginx
/usr/local/nginx/sbin/nginx -s reload #重新加载nginx配置文件
/usr/local/nginx/sbin/nginx -s stop		#停止nginx

升级Nginx版本

进行不停服务升级

  1. 查看现版本、安装模块、进程号
ps -ef | grep nginx
/usr/local/nginx/sbin/nginx -V	#记录安装时加载的模块
  1. 备份原版本nginx可执行文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
  1. 下载编译新版本Nginx-1.15.6
wget http://nginx.org/download/nginx-1.15.6.tar.gz
tar zxvf nginx-1.15.6.tar.gz -C /usr/local
cd nginx-1.15.6
./configure --prefix=.....(此处填写上一步中加载的模块内容)
make	#编译后即可,千万不能make install
  1. 将新的nginx可执行文件移到工作目录下
cp /usr/local/nginx-1.15.6/objs/nginx /usr/local/nginx/sbin/nginx
  1. 停止nginx老版本的请求处理,切换至新版本接收
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
  1. 查看升级后版本
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.15.6

增减Nginx模块

与版本升级大同小异,在Step3中./configure时新增模块名称

使用技巧

  • 配合include directory/*.conf的方式将多虚拟主机配置及upstream模块的配置文件分开,方便管理维护。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值