--- layout : post title : "初试NGINX" subtitle : "A High Performance Web Server" date : 2022-06-25 20:27:31 author : "Manford Fan" catalog : false header-img : "img/post-bg-universe.jpg" tags : - Nginx - Server --- 终于要开始记录[NGIINX](https://nginx.org/)这个系列的主题了,MySQL准备再拖一拖,先把nginx这个过一遍。Nginx是一种高性能的Web服务器,起主要作用有三个:处理静态资源,反向代理(缓存&负载均衡)以及API服务(OpenResty)。当前网络上Web服务器很多,比如最老牌的Apache,Tomcat,微软的Microsoft IIS(Internet Information Services),还有Lighttpd,IBM的WebSphere服务器,Oracle的Weblogic,以及W3C的Jigsaw等等下图是2022年5月份[Net Craft](https://news.netcraft.com/)网站统计的各种服务器市场占有率排行,目前Nginx已经超越Apache跃居第一了! ![nginx-1-ranking](/img/posts/nginx-1-ranking.png 'nginx-1-ranking') ## 一、Nginx概述 Nginx是由俄罗斯人伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,从2002开始开发,2004年发布了第一个版本,09年开始支持Windows版本,11年1.0版本发布,同时成立了nginx-plus商业公司15年发布了一个重要的功能,提供了stream四层反向代理,支持http2,截止到2022年6月,nginx最新稳定版本是1.22.0。 其核心特点如下 - 对操作系统内核深度挖掘,实现了高并发,高性能 - 优秀的模块化设计,生态圈号,可扩展性好 - 反向代理,负载均衡,保证了高可靠性 - 热部署,热升级 - BSD许可,可修改商用 ## 二、Nginx构成,安装以及配置文件 如果把nginx比喻成一辆汽车,那么跟这辆车相关的部分可简单分为四部分——车身本体,驾驶员,GPS导航以及维修厂,对应于相关文件分别是由源码各个模块编译出来的可执行文件,控制nginx行为的nginx.conf配置文件,记录每一条访问的access.log文件,定位问题的error.log文件。如下是nginx安装包的所有文件列表及其对应的功能: ```text auto -------- 编译必须的工具以及操作系统判断相关的文件 CHANGES ----- 英文版变更列表 CHANGES.ru -- 俄语版变更列表 conf -------- 配置文件夹 configure --- configure脚本,保证正确编译 contrib ----- 两个perl脚本,一个vim辅助工具 html -------- html示例文件 LICENSE ----- license文件 man --------- 帮助文档 README ------ 说明文档 src --------- 源码文件 ``` 编译安装详见**[Debian Server部署全过程记录](https://blog.rustle.cc/2022/03/29/debian_server/#4%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85nginx)**,这里着重记录下配置文件的语法。Nginx的配置文件是一个文本文件,存放在安装目录下的`conf`文件夹里,通常是nginx.conf,不过也可以使用`-c`选项手动指定。其语法规则基本如下: 1. 配置文件由指令和指令块构成 2. 每条指令以分号结尾,指令与参数之间用空格分隔 3. 指令块用大括号将多条指令组织在一起 4. `include`语句允许聚合多个配置文件以提高可维护性 5. 使用`#`符号作为注释,提高可读性 6. 使用`$`符号做变量引用 7. 部分指令参数支持正则表达式 8. 包括四个块:http,upstream,server,location 更多配置选项,比如模块功能,变量使用,可以参考[NGINX官方文档](https://nginx.org/en/docs/)。 ## 三、配置upstream CDN(Content Delivery Networks)可能是一个比较小众的名词,不太为人所知,它的角色可以用现实中的快递小哥作类比,是名副其实的网络界的快递小哥。简单来说就是将客户网站允许被缓存的内容存储到CDN的服务器上,用户再次访问的时候,直接从CDN服务器返回即可(因为CDN服务器遍布全国,甚至全世界,而自己的服务器受地域,带宽,本机性能的影响)。没错,`upstream`正是起关键作用的那一个,它可以将客户的内容以一定的算法存储起来,当用户需要的时候直接提供访问。 ```nginx # 模拟客户源站 # =============================================== server { listen 127.0.0.1:8080; location / { alias /root/nginx/wiki/; index index.html index.htm; } # 模拟CDN的VIP或RIP # =============================================== proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=mycache:100m max_size=10G inactive=60m use_temp_path=off; upstream local { server 127.0.0.1:8080; } server { listen 80; server_name nginx.rustle.cc; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache mycache; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 302 304 1d; proxy_pass http://local; } } ``` 如上是第一个配置是nginx服务器,模拟的是客户源站,第二个配置是OpenResty服务器,模拟的是CDN的VIP或者RIP,条件有限,就在同一个机器上部署了,不过效果是一样的。当用户访问OpenResty配置的域名时,会缓存下所有的文件,此时停止nginx服务,再次访问域名仍然可以成功现实页面。 ## 四、日志可视化工具-Go Access ## 五、其他补充 #### A. Nginx命令行 |选项|功能| |:-|:-| |-?,-h | this help| |-v | show version and exit| |-V | show version and configure options then exit| |-t | test configuration and exit| |-T | test configuration, dump it and exit| |-q | suppress non-error messages during configuration testing| |-s signal | send signal to a master process: stop, quit, reopen, reload| |-p prefix | set prefix path (default: /root/nginx/)| |-e filename | set error log file (default: logs/error.log)| |-c filename | set configuration file (default: conf/nginx.conf)| |-g directives | set global directives out of configuration file| 其中`-s`选项支持`stop`,`start`,`quit`,`reload`和`reopen`命令,功能分别是停止,启动,优雅退出,重载配置以及重新记录日志。 #### B. 单位相关 |**时间单位|含义|空间单位|含义**| |:-|:-|:-|:-| |ms|毫秒|NULL|不加单位,默认byte| |s|秒|k/K|kilobytes| |m|分钟|m/M|megabytes| |h|小时|g/G|gigabytes| |d|天||| |w|星期||| |M|月||| |y|年||| ## 六、参考文档 - []()