一、初识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 -y
2.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.gz
2.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_module
4.
5.useradd nginx -M -s /sbin/nologin
6.make && make install
7.ln -s /usr/local/nginx-1.21.5 /usr/local/nginx

6.2.2 测试nginx配置文件是否正常

1./usr/local/nginx/sbin/nginx -t
2.nginx: the configuration file /usr/local/nginx-1.21.5/conf/nginx.conf syntax is ok
3.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 signal
2.signal:
3.stop — fast shutdown
4.quit — graceful shutdown
5.reload — reloading the configuration file
6.reopen — reopening the log files
7.用来打开日志文件,这样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 -HUP cat /usr/local/nginx/nginx.pid

七、nginx基础配置文件

配置基础配置文件

1.worker_processes 1;
2.events {

  1. worker_connections 1024;
    4.}
    5.http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. sendfile on;
  5. keepalive_timeout 65;
  6. server {
  7. listen 80;
  8. server_name localhost;
  9. location / {
  10. root html;
  11. index index.html index.htm;
  12. }
  13. error_page 500 502 503 504 /50x.html;
  14. location = /50x.html {
  15. root html;
  16. }
  17. }
    22.}

测试配置文件是否正常

1.shell> /usr/local/nginx/sbin/nginx -t
2.nginx: the configuration file /usr/local/nginx-1.21.5/conf/nginx.conf syntax is ok
3.nginx: configuration file /usr/local/nginx-1.21.5/conf/nginx.conf test is successful
4.shell> curl -I http://localhost
5.HTTP/1.1 200 OK

八、如何对nginx进行监控

开启 nginx 监控服务

8.1 开启状态页

1.# 设定查看 nginx 状态地址
2.location /status {

  1. stub_status on; # 表示开启stubStatus的工作状态统计功能。
  2. access_log off; # access_log off; 关闭access_log 日志记录功能。
  3. #auth_basic "status"; # auth_basic 是nginx的一种认证机制。
  4. #auth_basic_user_file conf/htpasswd; # 用来指定密码文件的位置。
    7.}

8.2 配置登录密码

1.yum install -y httpd-tools
2./usr/local/apache/bin/htpasswd -c /usr/local/nginx/conf/htpasswd biglittleant
3.New password:

完成后会在 /usr/local/nginx/conf/ 目录下生成 htpasswd 文件。

8.3 访问URL

1.curl http://127.0.0.1/status
2.
3.Active connections: 20
4.server accepts handled requests

  1. 36 36 38
    6.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(){

  1. NGINX_PORT=$1
  2. NGINX_COMMAND=$2
  3. nginx_active(){
  4. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
  5. }
  6. nginx_reading(){
  7. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
  8. }
  9. nginx_writing(){
  10. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
  11. }
  12. nginx_waiting(){
  13. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
  14. }
  15. nginx_accepts(){
  16. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
  17. }
  18. nginx_handled(){
  19. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
  20. }
  21. nginx_requests(){
  22. /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
  23. }
  24. case $NGINX_COMMAND in
  25. active)
  26. nginx_active;
  27. ;;
  28. reading)
  29. nginx_reading;
  30. ;;
  31. writing)
  32. nginx_writing;
  33. ;;
  34. waiting)
  35. nginx_waiting;
  36. ;;
  37. accepts)
  38. nginx_accepts;
  39. ;;
  40. handled)
  41. nginx_handled;
  42. ;;
  43. requests)
  44. nginx_requests;
  45. esac
    47.}

nginx的功能多,使用起来需要注意的知识点也多,小编接下来将分几篇文章将nginx的一些使用心得分享出来,一起学习使用nginx,共同进步。

nginx-官方文档
nginx优化