Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名
Nginx
(1)轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
(2)抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
(3) nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
(4)nginx 的设计高度模块化,编写模块相对简单
(5)nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
(6)nginx 作为负载均衡服务器,支持 7 层负载均衡;nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
(7)启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级, 社区活跃,各种高性能模块出品迅速
Apache
(1) apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
(2)apache 发展到现在,模块超多,基本想到的都可以找到
(3)apache 更为成熟,少 bug ,nginx 的 bug 相对较多
(4)apache 超稳定,apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
(5)apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
(6)apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
总结
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程
一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配置项多。
转载
当解压nginx安装包后会生成,nginx相应目录:
(1)auto 目录中:
cc目录:编译,os目录:判断操作系统类型,lib和type目录:存放库文件,辅助编译
(2)CHANGES 跟以前版本的对比
(3)CHANGES.ru 俄罗斯版本的changes (作者是俄罗斯的)
(4)conf 存放配置文件,会copy到编译好的配置文件中
(5)configure 编译完的运行脚本
(6)contrib 提供语法检测的字体
(7)html 默认发布目录,存放默认的正确的和错误的访问页面
(8)LICENSE 版权声明
(9)man 帮助文档
(10)README 手册,指定了官网网址
(11)src 源码目录 里面都是源码的东西
(1)main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
(2)events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
(3)http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
(4)server块:配置虚拟主机的相关参数,一个http中可以有多个server。
(5)location块:配置请求的路由,以及各种页面的处理情况。
(1)定义Nginx运行的用户和用户组为nginx
#指的是worker的工作控制组是nginx用户,是为了保证系统的安全性。新建nginx用户及用户组
user nginx nginx;
#进程数,即处理请求的进程(熟称负责接客的服务员),服务中的进程数应该与实际硬件相匹配;初始可设置为cpu总核数如:worker_processes 8;
worker_processes 8;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#把进程号记录到文件,用于管理nginx进程
#pid logs/nginx.pid;
(4)Nginx的事件模型中的最大打开文件数
#Nginx的事件模型中的最大打开文件数,可设置为系统优化后的ulimit-HSn的结果,
即1024可改为65535,然后在/etc/security/limits.conf文件中修改,因为该文中是默认的nginx的连接数,
只需在该文件中修改即可
events {
worker_connections 1024; #nginx的最大连接数=worker连接数*worker进程数
}
gzip on; ##开启后,加载页面更迅速,并且会压缩页面
#limit_conn_zone 用来限制同一时间连接数,即并发限制
#limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”
$binary_remote_addr是限制同一客户端ip地址
zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
# 定义一个名为addr的limit_conn_zone $binary_remote_addr是限制同一客户端ip地址
#以下两条语句写在server之上
limit_conn_zone $binary_remote_addr zone=addr:10m; #大小是10M内存 10M的内存来对于IP传输开销
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #1s中不超过一个请求
...
location / {
root html;
index index.html index.htm;
}
location /download {
limit_conn addr 1; ##只能一个并发,多了会报错
limit_rate 50k; ##限制带宽,每秒最多50k
}
测试效果(在另一台主机进行压力测试):
(7)对客户端请求速度的限制
location /download {
# limit_conn addr 1; ##只能一个并发,多了会报错
limit_rate 50k; ##限制带宽,每秒最多50k
}
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 logs/access.log main;
sendfile on; #开启高效文件传输模式,实现内核零copy
#tcp_nopush on; #激活tcp_nopush参数可以允许把httpresponseheader和文件的开始放在一个文件里面发布,减少网络报文段的数量
#keepalive_timeout 0; #连接超时时间,单位是秒
keepalive_timeout 65;
#gzip on; #gzip压缩,对于网站优化极其重要
#设置基于域名的虚拟主机部分
server {
listen 80; #监听的端口,也可以是172.25.254.1:80形式
server_name localhost; #域名
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #默认访问的location标签段
root html; #站点根目录,即网站程序存放的目录
index index.html index.htm; #首页排序
}
#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$ { #符合php扩展名的请求调度到fcgi server
# root html;
# fastcgi_pass 127.0.0.1:9000; #抛给本机的9000端口(php fastcgi server)
# fastcgi_index index.php; #设定动态首页
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params; #设定和fastcgi交互的参数包含文件
#}
# 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;
# }
#}
#http虚拟主机
# 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;
# }
#}
}
vim /root/nginx/nginx-1.15.9/src/core/nginx.h ##修改相应配置文件
需要注意的是:如果想要隐藏版本号,这一配置需要在编译安装之前操作否则编译完成后,不能修改