Nginx是一款基于C语言开发的轻量级开源Web服务器软件,可作为反向代理、负载均衡、缓存服务器使用。
Nginx最初的设计是成为一个HTTP服务器,一个能够解决C10K问题的HTTP服务器。设计一个同时连接处理1w连接的web服务器,为了实现这个目标,Nginx通过基于事件的处理机制配置操作系统相应的事件机制,便可以解决C10K问题。
由于Nginx使用基于事件驱动的架构能够并发出发百万级别的TCP连接,高度模块化的设计和自由的许可证使得扩展Nginx功能的第三方模块层出不穷。
对于高效处理大规模并发连接,Nginx支持Linux的epoll、Solaris的event ports、FreeBSD的kqueue等。
对于Linux,Nginx支持其独有的sendfile系统调用,可高效地把硬盘中的数据发送到网络上,无需先将硬盘数据复制到用户内存上后发送,这极大地减少了内核与用户态数据间的复制动作。
Nginx竞争对手包括 Apache、Lighttpd、Tomcat、Jetty、IIS...
Apache发展时间长且作为世界第一大web服务器,由于它兴起时互联网产业规模远不如现在,所以被设计成一个重量级且不支持高并发的web服务器。在Apache上,如果有数以万计的并发HTTP请求同时访问,会直接导致服务器上消耗大量内存,操作系统内核对成百上千的Apache进程做进程间切换,消耗大量CPU资源,并导致HTTP请求的平均响应速度降低,这些都决定了Apache不可能成为高性能web服务器,也促使Lighttpd和Nginx的出现。
Nginx和Lightttp都是为高并发应用场景而设计的,Nginx具有性能高、稳定性好、结构模块化、配置简单、资源消耗低等优点。实际上,Nginx已经成为业界高性能Web服务器的代名词。
为什么选择Nginx呢
- 更快速
正常情况下,单次请求会得到更快的响应,其次在高峰期,Nginx比其他Web服务器更快地响应请求。 - 高扩张
Nginx的设计极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。
Nginx模块都是嵌入到二进制文件中执行的,无论官方还是第三方均如此。 - 高可靠
Nginx的高可靠性来自其核心框架代码的优秀设计、模块设计的简单性。 - 低内存
一般1w个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
5.单机支持10w+并发连接
理论上Nginx支持的并发连接上限取决于内存 - 热部署
Nginx的master管理进程和worker工作进程的分离设计,使得Nginx能够提供热部署功能。
选择Nginx的核心理由是它能支持高并发请求的同时保持高效的服务。
备注:Web/WWW服务器基本功能
- 基于REST架构风格
- 以统一资源描述符
URI
或统一资源定位符URL
作为沟通依据 - 通过HTTP为浏览器等客户端程序提供网络服务
Nginx应用场景
并发处理
- Tomcat 200
- Nginx 5W
反向代理
反向代理指以代理服务器来接收Internet上的连接请求,然后将请求转发给内网服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外表现为一个服务器。
反向代理服务器可作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。
安装配置
安装必备的库
- GCC
由于Nginx是使用C语言开发的,所以需要安装C语言编译器。 - PCRE
PCRE是Perl库,包括了Perl兼容的正则表达式,Nginx的HTTP模块使用的是PCRE来解析正则。 - ZLIB
zlib是压缩和解压的库,Ngnix使用的gzip对HTTP包进行压缩和解压。
下载解压安装
Ubuntu使用sudo apt-get install nginx
命令安装,安装完成后/usr/sbin
是nginx
命令所在,/etc/nginx
目录是nginx
配置文件。
$ sudo apt-get install nginx
$ wget
$ tar -zxvf nginx.tar.gz
$ cd nginx
# 指定安装位置,然后编译安装。
$ ./configure --prefix=/usr/local/nginx
$ make && make install
$ cd /usr/local/nginx/sbin
# 指定配置启动Nginx
$ ./nginx -c /usr/local/nginx/conf/nginx.conf
# 关闭Nginx,会像查出pid然后再kill进程,会存在丢包的问题。
$ ./nginx -s stop
# 完整关闭 优雅退出
$ ./nginx -s quit
查看Nginx进程是否启动
$ ps -ef | grep nginx
Nginx进程启动时,会附带一个守护进程,用于保护正式进程不被异常终止,如果守护进程一旦返现,Nginx继承将被终止,会自动重启该进程。守护进程一般称为master
进程,业务进程被称为worker
进程。
停止Nginx
# 强行停止Nginx服务器,当前若有尚未处理完毕的数据则丢弃。
$ nginx -s stop
# 优雅的停止Nginx服务器,当前若有尚处理完毕的数据,等待处理完成后停止Nginx。
$ nginx -s quit
配置文件
#*************************main:Nginx全局配置************************#
#指定工作进程运行的用户或组,默认nobody nobody。
#user nobody;
#工作进程数量:指定Nginx开启子进程的数量,运行过程中监控每个进程消耗内存,通常数量是CPU内核数量的整数倍。
worker_processes 1;
#错误日志输出级别与保存路径,级别为debug|info|notice|warn|error|crit|alert|emerg。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#Nginx进程运行文件存放位置
#pid logs/nginx.pid;
#指定单一进程可以打开最多文件数量的描述
#worker_rlimit_nofile 1024;
#*************************event:Nginx工作模式************************#
#Nginx服务器和用户网络连接
events {
#工作进程最大连接数:最大可同时接收的连接数量,最大连接数是和worker processes共同决定的。
worker_connections 1024;
#网络连接序列化,防止惊群现象发生,默认on。
#accept_mutex on;
#单一进程是否可以同时接受多个网络连接,默认off。
#multi_accept on;
#事件驱动模型:配置线程轮询方式 select|poll|kqueue|epoll|resing|/dev/poll|eventport
#use epoll;
}
#*************************http:HTTP协议信息配置************************#
#HTTP协议配置
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型,默认text/plain。
default_type application/octet-stream;
#是否开启服务日志
#access_log off;
#日志自定义格式
#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 logs/access.log main;
#是否允许sendfile方式传输文件,默认off。将文件的回写过程交给数据缓存区完成,而不是放在应用中完成,可提高性能。
sendfile on;
#tcp_nopush on;
#链接超时时间,默认75秒。
#keepalive_timeout 0;
keepalive_timeout 65;
#是否开启内容压缩
#gzip on;
#虚拟主机
server {
#监听端口
listen 8000;
#监听地址
server_name localhost;
#字符集类型
#charset koi8-r;
#日志路径与格式
#access_log logs/host.access.log main;
#路由正则匹配: ~区分大小写 ~*区分大小写
location / {
#根目录
root html;
#默认页
index index.html index.htm;
#请求转发
#proxy_pass http://svr
#拒绝IP
#deny 1272.0.0.1;
#允许IP
#allow 192.168.0.164;
}
#错误页
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#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;
# }
#}
}