这是一篇介绍Nginx基本信息和配置文件详情的文章,适合入门者,如果你想深入了解Nginx请绕道
什么是Nginx?
Nginx是轻量级,高性能,跨平台的web服务器
Nginx的特点
-
更快
- 单个请求的响应速度更快
- 在高并发时,Nginx比其他的web服务器具有更快的响应速度
- 高扩展性
Nginx是由不同具有低耦合模块组成的,这使得他具备支持大量第三方模块的特点
- 高可靠性(健壮性)
依赖于其和新框架代码的优秀设计和模块设计的简单性;当一个worker进程出错时,master管理进程会快速的拉起新的worker子进程提供服务
- 低内存消耗
体现在10000个非活跃的http keep-alive的连接在Nginx中紧消耗2.5M
- 单机支持十万以上并发
Nginx支持的并发连接上限取决于内存,但是十万原未封顶;能够及时的处理更多的并发请求时业务特点紧密相关的
实现原理:
- 热部署
master管理进程和worker工作进程的分离设计,使得Nginx能够支持热部署,也就是说在不间断的服务的前提下,升级Nginx的可执行文件,更新配置项和更换日志文件
- 支持bsd协议
也就是不只是支持免费试用nginx还允许用户在自己的项目中直接使用和修改源码
linux服务器中nginx命令
- 启动 /usr/local/nginx/sbin/nginx 如果nginx.config不是在默认路径下,请参考:/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf
-
停止
- /usr/local/nginx/sbin/nginx -s stop 注意.pid文件一定是默认的,如果.pid文件不是默认路径就需要在-s前加上-g"pid /var/nginx/test.pid"
- /usr/local/nginx/sbin/nginx -s quit 这种方式会等到Nginx正常处理完所有的请求后在停止服务
-
测试配置文件
- /usr/local/nginx/sbin/nginx -t
- 使用-v显示Nginx的版本信息
- 使用-V展示的版本信息更多
- 重启 /usr/local/nginx/sbin/nginx -s reload
- 日志文件回滚 /usr/local/nginx/sbin/nginx -s reopen
Nginx进程之间的关系
Nginx支持单进程(master进程)。使用master-worker方式配置同时启动多个线程 ,但是master进程不会对用户的请求提供服务,只用于管理worker进程,而 worker进程才会真正处理用户的请求。
worker简称基本介绍:
- worker进程的数量和服务器的cpu核心数相等 ,如果worker进程数大于CPU核数,就会加大进程间切换带来的消耗,因为Linux是抢占式内核
- worker是单线程的进程
- worker进程之间通过共享内存和原子操作等一些进程间的通信机制来实现 负载均衡
- 多个worker同时提供服务不但能够提高服务的健壮性,而且可以充分利用smp多核框架实现多核并发处理
什么方式反向代理方式
用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上有服务器上得到的结果返回给Internet上请求链接的客户端,此时代理服务器带外的表现就是一个web服务器
Nginx用作代理服务器的优缺点
过程:当客户端发来Http请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括Http包体)完整的接收到Nginx所在的服务器的硬盘或者内存中,然后在向上游服务器发起链接,把缓存的客户端请求转发到上游服务器。
优点:这样就节省上游服务器的被占用的时间,特别是当请求内容比较大时效果就非常明显,大大降低了上游服务器的负载,尽量把压力放在了Nginx服务器上。
缺点:延长了一个请求的处理时间,并增加了用于缓存请求内容内存和磁盘空间。
Nginx的nginx.config文件介绍
以下是nginx.config文件的基本内容:
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; # worker进程个数,默认是1 最好配置成和内核数量一致的worker进程数,这样在处理请求时效率最高
#worker_cpu_affinity 1000 0100 0010 0001; # 讲worker进程和CPU内核绑定
#pid /nginx/pid/nginx.pid; #指定nginx的master进程ID的pid文件存放路径
error_log logs/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug | info | notice | warn | error | crit | alert | emerg 关闭日志的唯一方式:/dev/null
#debug_connection 10.224.66.14:14 # 仅仅来自这个IP的地址的请求才会输出debug级别的日志,其他的请求仍然沿用error_log中配置的日志级别 注意:使用这个参数的前提是在执行configure时已经加入了--with-debug参数
events {
accept_mutex on; # 这是nginx的负载均衡锁,设置网路连接序列化,防止惊群现象发生,默认为on
#lock_file logs/nginx.lock # accept锁可能需要这个lock文件,如果accept锁关闭这个文件就完全不生效,如果打开并且由于编译程序,操作系统架构等因素导致Nginx不支持原子锁,这时才会用文件锁实现accept锁
multi_accept on; #建立新连接 当事件模型通知有新连接是,尽可能的对本次调度中客户端发起的所有TCP请求都建立连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #每个worker进程可以同时处理的最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表 include可以用于嵌入其他的配置文件 ,其后面的路径可以是绝对路径,也可以是相对路径(相对于nginx.config的相对路径)
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #日志记录 自定义格式
access_log logs/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream web-test {
server 127.0.0.1:8080;
# server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 80; #监听端口
server_name web.test.com; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root /; #根目录
#index vv.txt; #设置默认页
proxy_pass http://web-test; #请求转向mysvr 定义的服务器列表
#deny 127.0.0.1; #拒绝的ip
#allow 172.18.5.54; #允许的ip
}
}
#访问本地文件
server {
listen 80;
server_name babaike.kuangxiang.com;
default_type 'text/html';
autoindex on;
charset utf-8;
index index.html index.htm;
location / {
root D:/babaike;
rewrite ^(.*)\.(.*)!(.*)$ $1_$3.$2 break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root D:/dev/git/static/uxuexi/error;
}
}
#动静分离时使用
server {
listen 80;
server_name static.uxuexi.com;
charset utf-8;
index index.html;
location / {
root D:/dev/git/static/uxuexi;
rewrite ^(.*)\.(.*)!(.*)$ $1_$3.$2 break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root D:/dev/git/static/uxuexi/error;
}
}
}