一、 简介
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.
nginx可用于分布式部署,即把不同的ip:port 通过唯一的ip:port进行访问,
二、 安装编译工具及库文
yum -y install make zlib zlib-devel pcre-devel gcc-c++ libtool openssl openssl-devel
三、Nginx安装
源码文件放在/home/resource/nginx
3.1 nginx-upstream-fair-master
官方github下载地址:https://github.com/gnosek/nginx-upstream-fair
说明:如果从github下载最新版本,在安装到nginx 1.14.0版本时,会报出编译错误。需要对源码做一些修改,修改参照(如果你看到这篇文章时,github主已经修改了该bug,或者你用的是nginx 1.14.0以下版本,请忽视...):https://github.com/gnosek/nginx-upstream-fair/pull/27/commits/ff979a48a0ccb9217437021b5eb9378448c2bd9e
对于比较懒的童鞋,这里提供了已经修改好的源码包:https://files.cnblogs.com/files/ztlsir/nginx-upstream-fair-master.zip
解压
[root@localhost nginx]# unzip nginx-upstream-fair-master.zip
3.2 nginx_upstream_check_module-master
下载地址:https://github.com/yaoweibin/nginx_upstream_check_module
解压
[root@localhost nginx]#unzip nginx-upstream-fair-master.zip
给 upstream-fair 扩展 upstream_check_module 的 upstream_fair.patch 补丁。否则,当负载均衡采用fair模式时,fair将会不支持check
[root@localhost nginx]# cd nginx-upstream-fair-master
[root@localhost nginx-upstream-fair-master]# patch -p1 < ../nginx_upstream_check_module-master/upstream_fair.patch
3.3 Nginx安装
下载地址:https://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
给Nginx扩展 upstream_check_module 的 check_1.12.1+.patch 补丁。
[root@localhost nginx-1.14.0]# patch -p1 < ../nginx_upstream_check_module-master/check_1.12.1+.patch
编译设置
[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --add-module=/home/resources/nginx/nginx_upstream_check_module-master --add-module=/home/resources/nginx/nginx-upstream-fair-master
--prefix 为安装位置
安装
[root@localhost nginx-1.14.0]# make&make install
找不到openssl
checking for OpenSSL library ... not found
checking for OpenSSL library in /usr/local/ ... not found
checking for OpenSSL library in /usr/pkg/ ... not found
checking for OpenSSL library in /opt/local/ ... not found
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.
原因分析:是因为编译新版本openssl时,库的位置没有和nginx编译配置的位置吻合,导致无法找到对应库文件造成编译错误! 解决方法
#vi /nginx解压目录/auto/lib/openssl/conf 修改库的路径为lib64
------------
74 if [ $NGX_RPATH = YES ]; then
75 ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib64 -lssl -lcrypto"
76 else
77 ngx_feature_libs="-L/usr/local/lib64 -lssl -lcrypto"
保存
然后重新编译nginx 即可
添加到环境变量
打开如下文件
vi /etc/profile
在文件末尾添加如下语句,并保存
#nginx configure
export NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin
执行如下语句即可生效
source /etc/profile
输入如下语句,即可看到nginx版本信息
nginx -v
四、Nginx启动
进入目录/usr/local/nginx/sbin/nginx
或者在/usr/local/nginx也可以
或查看nginx安装地址
whereis nginx
4.1 启动:
nginx
nginx -c /path/nginx.conf # 以特定目录下的配置文件启动nginx:
systemctl命令启动
systemctl start nginx.service
重启nginx服务
systemctl restart nginx.service
重新载入配置文件
nginx -s reload
查看端口号
netstat -tlnp
4.2 停止
从容停止服务 这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。
nginx -s quit
立即停止服务 这种方法比较强硬,无论进程是否在工作,都直接停止进程。
nginx -s stop
systemctl 停止 systemctl属于Linux命令
systemctl stop nginx.service
killall 方法杀死进程 直接杀死进程,在上面无效的情况下使用,态度强硬,简单粗暴!
killall nginx
五、配置
5.1 配置文件
在/usr/local/nginx/conf/nginx.conf
检查配置文件是否正确
#检查指定的nginx配置文件是否正确
nginx -t -c /usr/local/nginx/conf/nginx.conf
# nginx -t
#检查默认的nginx配置文件
/usr/local/nginx/sbin/nginx -t #-t就是检查是否配置正确
# 全局参数设置
user nginx; #设置nginx使用的用户 默认nobody
worker_processes 4; #设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同
error_log logs/error.log; #指定错误日志
worker_rlimit_nofile 1024; #设置一个nginx进程能打开的最大文件数
pid /var/run/nginx.pid;
events {
worker_connections 1024; #设置一个进程的最大并发连接数
}
# http 服务相关设置
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"';
access_log /var/log/nginx/access.log main; #设置访问日志的位置和格式
sendfile on; #是否调用sendfile函数输出文件,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载
keepalive_timeout 65; # 连接超时时间
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
gzip on; #是否开启gzip压缩,将注释去掉开启
keepalive_timeout 65; #设置长连接的超时时间
#负载均衡设置
upstream cluster1 {
#ip_hash; #让每个终端只访问固定后端
#fair; 优先选择响应时间快的
server 0.0.0.0:8101 weight=1;
server 0.0.0.0:8102 weight=1;
} #设置需要连接的服务组,weight=1表示同等机会
# 虚拟服务器的相关设置
server {
listen 8100; #设置监听的端口
server_name 192.168.46.230; #设置绑定的主机名、域名或ip地址
charset koi8-r; # 设置编码字符
location / {
root html; #设置服务器默认网站的根目录位置,需要手动创建
index index.html index.htm; #设置默认打开的文档
proxy_pass http://cluster1; # 这里是upstream的名称
proxy_redirect off; # 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
proxy_set_header X-Real-IP $remote_addr; # 获取用户的真实 IP 地址
#后端的Web服务器可以通过 X-Forwarded-For 获取用户真实IP,多个 nginx 反代的情况下,例如 CDN。参见:http://gong1208.iteye.com/blog/1559835 和 http://bbs.linuxtone.org/thread-9050-1-1.html
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host; # 允许重新定义或者添加发往后端服务器的请求头。
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
error_page 500 502 503 504 /50x.html; #设置错误信息返回页面
location = /50x.html {
root html; #这里的绝对位置是/usr/local/nginx/html
}
}
# HTTPS server
web服务器配置
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
nginx.conf的组成:nginx.conf一共由三部分组成,分别为:全局块、events块、http块。在http块中又包含http全局块、多个server块。每个server块中又包含server全局块以及多个location块。在统一配置块中嵌套的配置快,各个之间不存在次序关系。
5.2 路径子目录不同跳转不同的地址或者不同的端口
location ~/edu/{
proxy_pass http://127.0.0.1:8080;
}
location ~/vod{
proxy_pass http://127.0.0.1:8081;
}
location ~/skj{
proxy_pass http://192.168.46.230:8081;
}
location [ = | ~ | ~* | ^~ ] rui{
......
}
1\. =:要求字符串与uri严格匹配
2\. ~: 用于表示uri包含正则表达式,并且区分大小写
3\. ~*: 用于表示uri包含正则表达式,不区分大小写
4\. ^~: 用于不包含正则表达式的uri前,要求nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不在使用location块中的正则uri和请求字符串做匹配
注意: 如果uri包含正则表达式,则必须要有~ 或者~* 标识
5.3 分配服务器策略
轮询:默认,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down调,能自动提出
weight: 权重, 默认为1,却终越高被分配的客户端越多
ip_hash: 每个请求按访问ip的hash结果分配,这样每个访问固定方位一个后端服务器(第三方插件)
fair: 按后端服务器的响应时间来分配请求,响应时间短的优先分配(第三方插件)
参考(https://www.jianshu.com/p/e64539590865)
5.4 动静分离
通过 location指定不同的后缀名实现请求转发。通过 指定不同的后缀名实现请求转发。通过 expires参数设置,可以使浏 参数设置,可以使浏 览器缓存过期时间,减少与服务之前的请求和流量。具体 览器缓存过期时间,减少与服务之前的请求和流量。具体 Expires定义:是给一个资源 设定一个过期时间,也就是说无需去 设定一个过期时间,也就是说无需去 服务端验证, 直接通过浏览器自身确认是否期即可服务端验证, 直接通过浏览器自身确认是否期即可所以不会产生额外的流量。此种方法非常适合经变动资源(如果更新文件, 所以不会产生额外的流量。不建议使用 Expires来缓存),我这里设置 来缓存),我这里设置 3d ,表示在这 ,表示在这 3 天之内访问这个 URLL,发送一 个请求,比对服务器该文件最后更新时间没有变化则不会从抓取返回状态码304, 如果有修改,则直接从服务器重新下载返回状态码 如果有修改,则直接从服务器重新下载返回状态码 200。
5.5 高可用
ngnix服务器分为一个主服务器和一个备份服务器
安装keepalived,安装后位于/etc/keepalived
apt-get install keepalived -y
#yum install keepalived -y
修改/etc/keepalived/keepalived.conf配置文件
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL #/etc/hosts
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port{
script "usr/local/src/nginx_check.sh" # 检测脚本地址
interval 2 #检测脚本执行的间隔
weight 2 #权重
}
vrrp_instance VI_1 {
state MASTER # 备份服务器将MASTER改为BACKUP
interface eth0 # ipconfig或者ifconfig 查询网卡名字
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大
advert_int 1 # 检测主备服务机是否或者的间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 # 虚拟地址
192.168.200.17
192.168.200.18
}
}
在/usr/local/src添加检测脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx 每no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
把两台服务器的nginx和keepalived启动
启动nginx: ./nginx
启动keepalived: systemctl start keepalived.service
六、Docker中的Nginx
docker 下载nginx镜像
docker pull nginx
启动nginx
docker run --name nginx -p 80:80 -d nginx
修改nginx.conf
进入容器中:
docker exec -it nginx bash
nginx.conf配置文件在/etc/nginx/下面,由于镜像没有安装vim,先安装vim
apt-get update
apt-get install vim
修改后,重启即可
或进行挂载方式修改
docker run --name nginx \
-p 80:80 \
-v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker-nginx/log:/var/log/nginx \
-v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-d nginx
七、 原理
原理
master 与worker
一个master和多个worker的好处
可以使用nginx -s reload热部署,利用nginx进行热部署操作,即正在进行的worker还按原来的配置进行,闲置的按新配置进行
每个worker是独立的进程,如果有其中一个worker出现问题,其他worker独立的,继续进行争抢,实现请求过程,不会造成服务中断
设置多少worker合适?
worker数和服务器的cpu数相等是最适宜的
连接数worker_connection
发送一个请求,占用worker的2个或者4个连接数
最大并发数
普通的静态访问最大并发数: wokers * worker_process/2
如果是http作为反向代理来说,最大并发数: worker*worker_process/4
参考1(https://www.cnblogs.com/skynet/p/4146083.html)
参考2(https://www.runoob.com/linux/nginx-install-setup.html)
[参考3]https://www.jianshu.com/p/5248366dfa88
参考4(https://zhuanlan.zhihu.com/p/112680766) Nginx之upstream的四种配置方式