Linux 下玩转 nginx 系列(一)——初识 nginx 及其使用入门
一、初识 nginx
nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器和通用 TCP/UDP 代理服务器。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好。
nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅因为响应静态页面的速度非常快,而且它的模块数量是 Apache 的 2/3。对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts ,适合用做 mongrel clusters 前端 HTTP 响应。nginx 和 Apache 一样用模块化设计,nginx 模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。
二、nginx 可提供的服务
web 服务
负载均衡 (反向代理)
web cache(web 缓存)
三、nginx 的优点
高并发,静态小文件
占用资源少。2 万并发、10 个线程,内存消耗几百 M
功能种类比较多。Web,cache,proxy。每一个功能都不是特别强
支持 epoll 模型,使得 nginx 可以支持高并发
nginx 配合动态服务和 Apache 有区别(FASTCGI 接口)
利用 nginx 可以对 IP 限速,可以限制连接数
配置简单,更灵活
四、nginx 的应用场合
静态服务器(图片,视频服务),如 html,js,css,flv,jpg,gif 等
动态服务,nginx—fastcgi 方式运行 PHP,JSP。(PHP 并发约 500-1500,MySQL 并发约 300-1500)
反向代理,负载均衡。日 pv2000W 以下,均可直接用 nginx 做代理
缓存服务。类似 SQUID,VARNISH
五、nginx 的特性
5.1 模块化设计、较好的扩展性
因此作为程序员可以为 nginx 设计第三方模块,不过与 httpd 不同的是,nginx 早期包括现在的版本虽然是模块化的,也就意味着说我们可以自行开发第三方模块对 Nginx 进行扩展,但是 nginx 不支持模块动态装卸载的,也就是说编译的时候只能静态直接编译进 nginx 而且随 nginx 的启动而启动,即模块编译好之后可以直接使用,但只能直接编译成 nginx 组成部分,只要 nginx 启动,那么这个模块就一定会启动,它不支持动态装卸载。但是 Tengine 对 nginx 的改进使得 Tengine 支持模块动态装卸载。
5.2 高可靠性
这是已经经过市场广泛验证的;它的高可靠性是靠其特殊的工作机制来实现的,其高可靠性依赖于主控进程与工作进程或工作线程的架构来实现的。虽然形容为特殊但是其实 httpd 也是这么工作的。nginx 的组成部分实际上是由一个主控进程 master 加多个子进程 worker 共同组成的,它有一个主控进程 master,主控进程并不负责接收并响应任何用户请求,主控进程负责生成多个工作进程 worker。其主控进程主要负责读取并验证即解析配置文件、创建绑定或关闭套接字、以及启动或终止维护 worker 进程的个数、还有无需重启进程让新配置文件中的新配置加载甚至于完成平滑版本升级等等。而 worker 子进程有多种种类,有的 worker 是实现缓存加载的,这在其反向代理模式中才有用、而有些是负责响应用户请求说白了就是接收传入并处理客户端的连接请求的、此外 worker 进程中还有一种进程叫做 Cache Manager 用来实现缓存管理。
5.3 低内存消耗
由于 Nginx 是使用一个内存响应 n 个请求的,所以它对内存的消耗非常低,有人做过统计说 1w 个保持连接 keep-alive 状态或模式下的 connection,Nginx 只需要消耗 2.5M 内存来维护。
5.4 支持热部署
所谓热部署指的是如果我们的配置文件更新了不用重启 nginx,新配置文件就能够生效了。甚至于 nginx 的版本更新了,如现在用的是 1.19 的版本想升级到 1.21,1.19 的版本不用停机,1.21 的慢慢就会切上去了。过后等 1.21 的切换完成了可以让 1.19 的再下线。所以他支持热部署,因此这里的热部署指的是不停机而更新配置文件或者是更换日志文件即日志文件的滚动也包括升级程序版本等等都能实现。这就是热部署的功能。
5.5 支持事件驱动机制、AIO(异步 IO)、mmap(内存映射机制)
5.6 通过差距(mod_secdownload)可实现文件 URL 地址加密。
六、nginx 实战过程
6.1 安装依赖包
小编使用的操作系统是 CentOS 7.6。nginx 安装依赖 GCC、openssl-devel、pcre-devel、zlib-devel 软件库。Pcre 全称(Perl Compatible Regular Expressions),中文 perl 兼容正则表达式,pcre 官方站点。
1.yum install pcre pcre-devel -y2.yum install openssl openssl-devel -y
nginx 官方源码下载地址:https://nginx.org/en/download.html
6.2 开始编译
使用./configure --help 查看各模块使用情况,用 --without-http_ssi_module 方式关闭不需的模块。可用 --with-http_perl_modules 方式安装需要的模块。
6.2.1 编译命令
1.tar -zxvf nginx-1.21.5.tar.gz2.cd nginx-1.21.5/3../configure --prefix=/usr/local/nginx-1.21.5 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module4.5.useradd nginx -M -s /sbin/nologin6.make && make install7.ln -s /usr/local/nginx-1.21.5 /usr/local/nginx
6.2.2 测试 nginx 配置文件是否正常
1./usr/local/nginx/sbin/nginx -t2.nginx: the configuration file /usr/local/nginx-1.21.5/conf/nginx.conf syntax is ok3.nginx: configuration file /usr/local/nginx-1.21.5/conf/nginx.conf test is successful
6.2.3 启动 nginx 服务器
1./usr/local/nginx/sbin/nginx -t # 检查配置文件 2./usr/local/nginx/sbin/nginx # 确定 nginx 服务 3.netstat -lntup |grep nginx # 检查进程是否正常 4.curl http://localhost # 确认结果
6.2.4 nginx 其他命令
1.nginx -s signal2.signal:3.stop — fast shutdown4.quit — graceful shutdown5.reload — reloading the configuration file6.reopen — reopening the log files7.用来打开日志文件,这样 nginx 会把新日志信息写入这个新的文件中
/usr/local/nginx/sbin/nginx -V 查看已经编译的参数。
使用 kill 命令操作 nginx。格式:kill -信号 PID 信号名称
TERM,INT 快速关闭
QUIT 优雅的关闭,保持吸纳有的客户端连接
HUP 重启应用新的配置文件
USR1 重新打开日志文件
USR2 升级程序
WINCH 优雅的关闭工作进程
例子
1.kill -QUIT
cat /usr/local/nginx/nginx.pid
2.kill -HUPcat /usr/local/nginx/nginx.pid
七、nginx 基础配置文件
配置基础配置文件
1.worker_processes 1;2.events {3. worker_connections 1024;4.}5.http {6. include mime.types;7. default_type application/octet-stream;8. sendfile on;9. keepalive_timeout 65;10. server {11. listen 80;12. server_name localhost;13. location / {14. root html;15. index index.html index.htm;16. }17. error_page 500 502 503 504 /50x.html;18. location = /50x.html {19. root html;20. }21. }22.}
测试配置文件是否正常
1.shell> /usr/local/nginx/sbin/nginx -t2.nginx: the configuration file /usr/local/nginx-1.21.5/conf/nginx.conf syntax is ok3.nginx: configuration file /usr/local/nginx-1.21.5/conf/nginx.conf test is successful4.shell> curl -I http://localhost5.HTTP/1.1 200 OK
八、如何对 nginx 进行监控
开启 nginx 监控服务
8.1 开启状态页
1.# 设定查看 nginx 状态地址
2.location /status {
3. stub_status on; # 表示开启 stubStatus 的工作状态统计功能。4. access_log off; # access_log off; 关闭 access_log 日志记录功能。5. #auth_basic "status"; # auth_basic 是 nginx 的一种认证机制。6. #auth_basic_user_file conf/htpasswd; # 用来指定密码文件的位置。7.}
8.2 配置登录密码
1.yum install -y httpd-tools2./usr/local/apache/bin/htpasswd -c /usr/local/nginx/conf/htpasswd biglittleant3.New password:
完成后会在 /usr/local/nginx/conf/ 目录下生成 htpasswd 文件。
8.3 访问 URL
1.curl http://127.0.0.1/status2.3.Active connections: 204.server accepts handled requests5. 36 36 386.Reading: 0 Writing: 2 Waiting: 0
active connections – 活跃的连接数量
server accepts handled requests — 总共处理了 16 个连接 , 成功创建 16 次握手, 总共处理了 18 个请求
Reading — 读取客户端的连接数
Writing 响应数据到客户端的数量
Waiting 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 即 Nginx 已处理完正在等候下一次请求指令的驻留连接
8.4 编写 zabbix 监控脚本
1.nginx_status_fun(){2. NGINX_PORT=24. nginx_active(){5. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print NF}'6. }7. nginx_reading(){8. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print 2}'9. }10. nginx_writing(){11. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print 4}'12. }13. nginx_waiting(){14. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print 6}'15. }16. nginx_accepts(){17. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print 1}'18. }19. nginx_handled(){20. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print 2}'21. }22. nginx_requests(){23. /usr/bin/curl "http://127.0.0.1:"NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print 3}'24. }25. case $NGINX_COMMAND in26. active)27. nginx_active;28. ;;29. reading)30. nginx_reading;31. ;;32. writing)33. nginx_writing;34. ;;35. waiting)36. nginx_waiting;37. ;;38. accepts)39. nginx_accepts;40. ;;41. handled)42. nginx_handled;43. ;;44. requests)45. nginx_requests;46. esac47.}
nginx 的功能多,使用起来需要注意的知识点也多,小编接下来将分几篇文章将 nginx 的一些使用心得分享出来,一起学习使用 nginx,共同进步。
参考资料:
Nginx 教程(一) Nginx 入门教程(https://www.cnblogs.com/crazylqy/p/6891929.html)
死磕 nginx 系列(https://www.cnblogs.com/biglittleant/p/8979063.html)
nginx-官方文档 nginx 优化
版权声明: 本文为 InfoQ 作者【anyRTC开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/4bf870473e4a2ef28ab654730】。文章转载请联系作者。
评论