这是我参与更文挑战的第13天,活动详情查看: 更文挑战
1, 前话
NGINX是一个高性能的HTTP和方向代理web服务器,同时也提供了IMAP/POP3/SMTP 等邮件服务。其特点是占用内存少,并发能力强,事实上NGINX的并发能力在同类型的网页服务器中表现较好,NGINX是一个安装非常简单,配置文件非常简洁,BUG非常少的服务,NGINX启动特别容易,并且基本上可以做到7*24不间断运行,即使运行数月也不需要重新启动,官方测试表明能够支持高达5000个并发连接响应。
2, NGINX作用
HTTP 代理, 方向代理: 作为web服务器 最常用的功能之一, 负载均衡
正向代理:简单理解,代理客户端请求,像VPN, 翻墙
反向代理:简单理解,代理服务器端
负载均衡: nginx提供两种策略进行负载均衡:
内置策略: 轮询,加权轮询,IP Hash
扩展策略: 天马行空,只有你想不到的没有他做不到的
动静分离: 有些页面,需要后端请求,返回动态网页,也有些不需要经过后端处理的文件,这部分文件是静态文件,根据一定的规则,把不变的资源和经常变的资源区分开,提高资源响应速度。
3, NGINX的优点
(1)速度更快,并发更高
(2)配置简单,扩展性强
(3)高可靠性
NGINX采用的是多进程模式运行,其中一个master主进程和N多个worker进程,worker进程的数量我们可以手
动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快
速创建新的worker进程提供服务
(4)热部署
NGINX可以7*24小时提供服务,可以在NGINX不停止的情况下,对NGINX进行文件升级,更新配置和更换日志文件
(5)成本低,BSD许可证
BSD是一个开源的许可证,NGINX本身是开源的,我们不久可以免费的将NGINX应用在商业领域,还可以在项目中
直接修改NGXIN的源码
4, NGINX常用模块
1, 静态资源部署
2,Rewrite地址重写
3,正则表达式
4,方向代理
5,负载均衡: 轮询,ip_hash, url_hash, fair
6, web缓存
7, 环境部署,热更新,
8, 用户认证模块
NGXIN的核心组成
nginx: 二进制文件
nginx.conf 配置文件
error.log. 错误日志
access.log 访问日志记录
5, NGINX 安装
# 安装nginx所需的环境
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
1, 查看,卸载
whereis nginx
如果存在:
rm -rf /usr/sbin/nginx
如果是yum安装的
yum remove nginx
2, 源码安装
# 找到官网需要下载的版本,右键复制下载链接地址
wget http://nginx.org/download/nginx-1.20.1.tar.gz
# 创建文件夹,把下载的压缩包copy过去
mkdir -p nginx/core
mv nginx-1.20.1.tar.gz nginx/core
# 解压缩
tar -xzf nginx-1.16.1.tar.gz
# 进入资源文件,找到configure
./configure
# 编译
make
# 安装
make install
# 查找安装的nginx目录位置
whereis nginx
3,yum安装
# 安装yum-utils
yum install yum-utils
# 添加yum源文件, 打开下面的配置文件,添加配置
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 最后安装nginx
yum install -y nginx
6, NGINX目录分析
1, 安装tree工具
yum install -y tree
2, 查看nginx目录结构
tree /usr/local/nginx
3, 配置分析
# 访问日志查看
tail -f nginx/logs/access.log
# error 日志查看
tail -f nginx/logs/error.log
# 主要的配置
nginx.conf
# 可执行文件
sbin/nginx
7, NGINX 命令
1, NGXIN 服务的信号控制
# 查看当前服务是否有nginx进程
ps -ef | grep nginx
# 查看nginx对应的PID
通过ps -ef | grep nginx 执行,显示的 master 进程的ID就是PID
master 进程控制着多个worker进程
| 信号 | 作用 |
|---|---|
| TERM | 立刻关闭整个服务 |
| QUIT | 优雅的关闭整个服务(处理完当前的请求,不在接受新的请求) |
| HUP | 重读配置文件 |
| WINCH | 所有子进程不在接受处理新链接 |
| USR2 | 平滑升级到最新版本的NGINX |
对应的命令:signal就是上面的信号单词
PID就是master的进程ID
kill -signal PID
kill -QUIT 123459
2, NGINX命令行控制
进入 cd /usr/local/nginx/sbin
# 帮忙查看
./nginx -h
# 版本
./nginx -v
# 配置文件验证
./nginx -t
# 启动nginx服务
./nginx
# 停止NGINX服务
./nginx -s stop
# 退出
./nginx -s quit
# 重新加载
./nginx -s reload
8, NGINX 核心配置文件
默认情况,核心配置文件在: /usr/local/nginx/nginx.conf, 很多注解是参考网上各位大神的理解
nginx.conf配置文件中默认的三大块: 全局块, events快, http快
http块中可以配置多个server块,每个server块有可以配置多个locaton快
#定义Nginx运行的用户和用户组, 可查看静态文件所属的用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;
#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
worker_rlimit_nofile 65535;
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
#理论上每台nginx服务器的最大连接数为。
worker_connections 65535;
#keepalive超时时间。
keepalive_timeout 60;
#客户端请求头部的缓冲区大小。
client_header_buffer_size 4k;
#为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
#inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=65535 inactive=60s;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 80s;
open_file_cache_min_uses 1;
open_file_cache_errors on;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#默认编码
#charset utf-8;
#服务器名字的hash表大小
server_names_hash_bucket_size 128;
#客户端请求头部的缓冲区大小
client_header_buffer_size 32k;
#客户请求头缓冲大小。
large_client_header_buffers 4 64k;
#设定通过nginx上传文件的大小
client_max_body_size 8m;
#开启高效文件传输模式,
sendfile on;
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex on;
#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
tcp_nopush on;
tcp_nodelay on;
#长连接超时时间,单位是秒
keepalive_timeout 120;
#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 on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#负载均衡配置
upstream jsbbmm.top.cn {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。
# weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.w3cschool.cn w3cschool.cn;
index index.html index.htm index.php;
root /data/www/w3cschool;
#对******进行负载均衡
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
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;
#表示使nginx阻止HTTP应答代码为400或者更高的应答。
proxy_intercept_errors on;
#后端服务器连接的超时时间_发起握手等候响应超时时间
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 90;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
pdf|xls|mp3|wma)$
{
expires 15d;
}
location ~ .*.(js|css)?$
{
expires 1h;
}
}
}
9, 总结
学习是一个不断巩固的过程,很多配置和理解,还需要自己在实战中不断摸索,有些知识够用即可,当需要的时候,可以立刻进入高效状态,