{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2019-12-18 11:06:09","updateBy":"admin","updateTime":"2026-02-15 11:46:28","remark":null,"id":6,"articleTitle":"Nginx（一）安装、配置","articleUrl":"nginx_install_and_upgrade","articleThumbnail":"https://www.asumimoe.com/imgfiles/20250618/4b57c2e46f8949e5a30d4e2e9e8a8fd5.png","articleFlag":"1","draftStatus":"1","reprintStatement":"0","articleSummary":"Nginx(\"engine x\")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器，也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下，Nginx是Apache服务器不错的替代品。","articleContent":"## Nginx介绍\n\nNginx (engine x) 是一个高性能的HTTP和反向代理web服务器，同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点（俄文：Рамблер）开发的，第一个公开版本0.1.0发布于2004年10月4日。\n其将源代码以类BSD许可证的形式发布，因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日，nginx 1.0.4发布。\n\n### nginx基本特性\n\n- 可针对静态资源高速并发并支持缓存。\n- 可以实现反向代理加速，并可进行数据缓存。\n- 具有负载均衡，节点健康检查功能。\n- 支持SSL、TLS、SNI。\n- 具有模块化架构：过滤器包括gzip压缩、ranges支持、chunked响应等功能。\n\n### Nginx Web服务特性\n\n- 支持基于名字、端口、IP的多虚拟主机站点。\n- 支持keep-alived 和piplined连接。\n- 可进行简单、方便、灵活的配置和管理。\n- 支持修改Nginx配置，并在代码上线是平滑重启，不中断业务访问。\n- 可自定义访问日志格式，临时缓冲写日志操作，快速日志轮询及通过rsyslog处理日志。\n- 可利用信号控制 Nginx 进程。\n- 支持 3xx-5xx HTTP状态码重定向。\n- 支持 rewrite 模块，支持 URI 重写及正则表达式匹配。\n- 支持基于客户端 IP 地址和 HTTP 基本认证的访问控制。\n- 支持 PUT、DELETE、MKCOL、COPY 及 MOVE 等特殊的 HTTP 请求方法。\n- 支持 FLV 流和 MP4 流技术产品应用。\n- 支持 HTTP 响应速率限制。\n- 支持同一 IP 地址的并发连接或请求数限制。\n- 支持邮件服务代理。\n\n### Nginx与Apache对比\n\n- nginx是轻量级服务器，占用资源较少，抗并发能力强。Apache占用资源相对较多。\n- nginx处理静态资源的能力比Apache强，Apache处理动态资源能力强，Nginx处理动态资源需要加载fastcgi模块。\n- nginx不支持类似 Apache 的动态模块加载，安装扩展模块必须重新编译 Nginx（ Tengine 支持动态模块加载）\n- Nginx 不仅支持 Web服务，同时还能做反向代理或负载均衡服务以及前端业务数据缓存服务。\n\n## 编译安装Nginx\n\n### 1. 下载nginx\n\n```bash\ncd /packages\nwget http://nginx.org/download/nginx-1.16.0.tar.gz\ntar zxvf nginx-1.16.0.tar.gz\ncd nginx-1.16.0\n```\n\n### 2.添加nginx用户和用户组\n\n```bash\ngroupadd nginx\nuseradd -g nginx -r nginx\n```\n\n### 3.安装依赖包\n\n```bash\nyum install -y gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl openssl-devel libtool\n\ngcc gcc-c++\n    gcc为GNU Compiler Collection的缩写，可以编译C和C++源代码等，它是GNU开发的C和C++以及其他很多种语言 的编译器（最早的时候只能编译C，后来很快进化成一个编译多种语言的集合，如Fortran、Pascal、Objective-C、Java、Ada、 Go等。）\n    gcc 在编译C++源代码的阶段，只能编译 C++ 源文件，而不能自动和 C++ 程序使用的库链接（编译过程分为编译、链接两个阶段，注意不要和可执行文件这个概念搞混，相对可执行文件来说有三个重要的概念：编译（compile）、链接（link）、加载（load）。源程序文件被编译成目标文件，多个目标文件连同库被链接成一个最终的可执行文件，可执行文件被加载到内存中运行）。因此，通常使用 g++ 命令来完成 C++ 程序的编译和连接，该程序会自动调用 gcc 实现编译。\n    gcc-c++也能编译C源代码，只不过把会把它当成C++源代码，后缀为.c的，gcc把它当作是C程序，而g++当作是c++程序；后缀为.cpp的，两者都会认为是c++程序，注意，虽然c++是c的超集，但是两者对语法的要求是有区别的。\n\nmake automake\n    make是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件。Make可以从一个名为makefile的文件中获得如何构建你所写程序的依赖关系，Makefile中列出了每个目标文件以及如何由其他文件来生成它。\n    automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in，automake还需用到perl，由于automake创建的发布完全遵循GNU标准，所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。\n\nautoconf\n    autoconf是用来生成自动配置软件源代码脚本（configure）的工具\n\npcre pcre-devel\n    在Nginx编译需要 PCRE(Perl Compatible Regular Expression)，因为Nginx 的Rewrite模块和HTTP 核心模块会使用到PCRE正则表达式语法。\n\nzlip zlib-devel\n    nginx启用压缩功能的时候，需要此模块的支持。\n\nopenssl openssl-devel \n    开启SSL的时候需要此模块的支持。\n\nlibtool\nlibtool是一个通用库支持脚本，将使用动态库的复杂性隐藏在统一、可移植的接口中；使用libtool的标准方法，可以在不同平台上创建并调用动态库。\nlibtool主要的一个作用是在编译大型软件的过程中解决了库的依赖问题；将繁重的库依赖关系的维护工作承担下来，从而释放了程序员的人力资源。libtool提供统一的接口，隐藏了不同平台间库的名称的差异等细节，生成一个抽象的后缀名为la高层库libxx.la（其实是个文本文件），并将该库对其它库的依赖关系，都写在该la的文件中。\n```\n\n### 4.创建相关目录并执行编译\n\n```bash\nmkdir /etc/nginx\nmkdir /usr/local/nginx\nmkdir /usr/local/nginx/{log,locks}\nmkdir /var/run/nginx\nmkdir -pv /usr/local/nginx/tmp{client,proxy,fastcgi,uwsgi,sgi}\n\n./configure --prefix=/usr/local/nginx  \\\n--conf-path=etc/nginx/nginx.conf  \\\n--user=nginx --group=nginx  \\\n--error-log-path=/usr/local/nginx/log/error.log  \\\n--http-log-path=/usr/local/nginx/log/access.log  \\\n--pid-path=/var/run/nginx/nginx.pid  \\\n--lock-path=/usr/local/nginx/locks/nginx.lock  \\\n--with-http_ssl_module  \\\n--with-http_stub_status_module  \\\n--with-http_gzip_static_module  \\\n--http-client-body-temp-path=/usr/local/nginx/tmp/client  \\\n--http-proxy-temp-path=/usr/local/nginx/tmp/proxy  \\\n--http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi  \\\n--http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi  \\\n--http-scgi-temp-path=/usr/local/nginx/tmp/scgi\n\nmake && make install\n```\n\n### 5.nginx启动停止与重启\n\n```bash\n/usr/local/nginx/sbin/nginx 启动\n/usr/local/nginx/sbin/nginx -s stop 停止\n/usr/local/nginx/sbin/nginx -s reload 重启\n```\n\n### 6.nginx重新编译添加新模块\n\n如：添加echo-nginx-moudle模块\n    \n\n```bash\nwget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz\ntar -zxvf v0.61.tar.gz \n```\n\n- 1）执行nginx -V查看当前编译情况，可以把编译相关参数复制出来\n\n- 2）进入源码目录重新编译（只需在原有的编译参数后加一行 --add-module=/usr/local/src/v0.61.tar）\n\n- 3）执行编译操作（注意这一步只需要执行make，不用执行make install）\n\n- 4）覆盖原有的nginx命令\n\n\n  mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak\n  cp /objs/nginx /usr/local/nginx/sbin/nginx\n\n- 5）nginx重新启动\n\n\n```bash\n/usr/local/nginx/sbin/nginx -s reload\n```\n\n## yum安装nginx\n\n### 1.添加 Nginx 官方 Yum 源\n\n```bash\n[nginx-stable]\nname=nginx stable repo\nbaseurl=http://nginx.org/packages/centos/$releasever/$basearch/\ngpgcheck=0\nenabled=1\n```\n\n### 2.安装nginx\n\n```bash\n#会自动解决依赖问题\nyum install nginx -y\n```\n\n### 3.启动nginx\n\n```bash\n#启动nginx并设置为开机自启\nsystemctl start nginx\nsystemtl enable nginx\n```\n\n## Nginx启动\n\nnginx配置文件如果不做任何修改直接启动的话需要注意以下权限问题。\n\n```bash\nuser nginx;\nworker_processes auto;\nerror_log /var/log/nginx/error.log;\npid /run/nginx.pid;\n```\n\n配置文件中的user指的是worker进行的启动用户。\n\nmaster进程依然需要使用root用户启动。这是因为：\n\n- **必须使用特权端口**：Nginx 需要监听 80/443 等 1024 以下的端口，这些端口只有 `root` 用户才能绑定。因此 master 进程必须以 `root` 启动才能完成端口绑定操作。\n- **读取敏感文件**：SSL 证书、配置文件等可能需要特殊权限，`root` 能确保无障碍读取。\n\n### 相关目录、文件权限问题\n\n| 类型         | 路径示例                                                  | 用途                         | 访问需求    | 属主数组    | 权限    |\n| :----------- | :-------------------------------------------------------- | :--------------------------- | :---------- | ----------- | ------- |\n| 配置文件     | `/etc/nginx/nginx.conf`<br> `/etc/nginx/conf.d/`          | Nginx 配置                   | master 读取 | root:root   | 644     |\n| 日志文件     | `/var/log/nginx/access.log`<br>`/var/log/nginx/error.log` | 访问日志和错误日志           | worker 写入 | nginx:nginx | 755     |\n| 缓存目录     | `/var/cache/nginx/`                                       | proxy_cache/fastcgi_cache 等 | worker 读写 | nginx:nginx | 755     |\n| 静态文件目录 | `/usr/share/nginx/html/`                                  | 提供静态文件                 | worker 读取 | root:root   | 755/644 |\n| SSL 证书     | `/etc/nginx/ssl/`                                         | SSL 证书和私钥               | master 读取 | root:root   | 644     |\n| PID 文件     | `/var/run/nginx.pid`                                      | 存储 master 进程 PID         | master 写入 | root:root   | 644     |\n\n## Nginx升级\n\n使用yum安装的nginx升级比较简单，只需将重要文件备份好后执行一条命令即可升级`yum update nginx -y`。\n\n编译安装方式则需要重新编译。可实现平滑升级。升级过程中可保证服务一直在线。Nginx可以实现平缓停止work process与旧的Nginx服务进程。\n\n### 1.下载新版本的源码包\n\n```bash\nwget http://nginx.org/download/nginx-version.tar.gz\n```\n\n### 2.查看原版本编译信息\n\n```bash\n/usr/local/nginx/sbin/nginx -V\n```\n\n### 3.将nginx重要文件备份\n\n```bash\ncp /usr/sbin/nginx /usr/sbin/nginx.back \ncp -rf /etc/nginx /etc/nginx.back\n```\n\n### 4.重新进行编译\n\n```bash\n./configure --prefix=/usr/local/nginx  \\\n--conf-path=etc/nginx/nginx.conf  \\\n--user=nginx --group=nginx  \\\n--error-log-path=/usr/local/nginx/log/error.log  \\\n--http-log-path=/usr/local/nginx/log/access.log  \\\n--pid-path=/var/run/nginx/nginx.pid  \\\n--lock-path=/usr/local/nginx/locks/nginx.lock  \\\n--with-http_ssl_module  \\\n--with-http_stub_status_module  \\\n--with-http_gzip_static_module  \\\n--http-client-body-temp-path=/usr/local/nginx/tmp/client  \\\n--http-proxy-temp-path=/usr/local/nginx/tmp/proxy  \\\n--http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi  \\\n--http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi  \\\n--http-scgi-temp-path=/usr/local/nginx/tmp/scgi\n\nmake此处同样不能执行make install\n```\n\n### 5.将二进制文件用新版本替换\n\n```bash\ncp objs/nginx /usr/local/nginx/sbin/\n```\n\n### 6.确保配置文件无报错\n\n```bash\n/usr/local/nginx/sbin/nginx -t\n\nnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful\n```\n\n### 7.平滑切换\n\n```bash\nkill -USR2 `cat /var/run/nginx/nginx.pid`              将旧版本Nginx的主进程将重命名为nginx.pid.oldbin，并执行新版本的Nginx可执行程序，启动新的主进程和新的工作进程，再次生成新的nginx.pid文件\nkill -WINCH `cat /var/run/nginx/nginx.pid.oldbin`      平缓停止worker process(此步骤可省略)\n如果需要回滚旧版本则使用HUP信号，它会重新启动工作进程，仍使用旧配置文件\nkill -HUP `cat /var/run/nginx/nginx.pid.oldbin`\nkill -QUIT `cat /var/run/nginx/nginx.pid.oldbin`       平缓停止旧的Nginx服务进程\n```\n\n\n​    \n\n### 8.补充：nginx信号接收和处理\n\n```bash\n主进程支持的信号\n\nTERM, INT: 立刻退出\nQUIT: 等待工作进程结束后再退出\nKILL: 强制终止进程\nHUP: 重新加载配置文件，使用新的配置启动工作进程，并逐步关闭旧进程。\nUSR1: 重新打开日志文件\nUSR2: 启动新的主进程，实现热升级\nWINCH: 逐步关闭工作进程\n\n工作进程支持的信号\nTERM, INT: 立刻退出\nQUIT: 等待请求处理结束后再退出\nUSR1: 重新打开日志文件\n```\n\n\n参考自：<https://www.cnblogs.com/wushuaishuai/p/9366402.html><https://www.cnblogs.com/wanghs8/p/11545324.html>","categoryId":12,"viewCount":1421,"categoryName":"Nginx","author":"球接子","authorAvatar":null,"tagIds":[10,13,14],"tagNames":["Linux基础","Nginx","中间件"]}}