title | date | tags |
---|---|---|
Nginx
|
2019-07-07 13:33:00 -0700
|
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_format
的main
。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地址一定要与phplisten /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,通常此值以服务类别或域名命名。 -
负载均衡调度算法
ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。weight
(默认方式)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。fair
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。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版本
进行不停服务升级
- 查看现版本、安装模块、进程号
ps -ef | grep nginx
/usr/local/nginx/sbin/nginx -V #记录安装时加载的模块
- 备份原版本nginx可执行文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
- 下载编译新版本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
- 将新的nginx可执行文件移到工作目录下
cp /usr/local/nginx-1.15.6/objs/nginx /usr/local/nginx/sbin/nginx
- 停止nginx老版本的请求处理,切换至新版本接收
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
- 查看升级后版本
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.15.6
增减Nginx模块
与版本升级大同小异,在Step3中./configure时新增模块名称
使用技巧
- 配合include directory/*.conf的方式将多虚拟主机配置及upstream模块的配置文件分开,方便管理维护。