Nginx入门教程
安装
Windows安装
进入官方下载地址,选择合适版本(nginx/Windows-xxx)。

解压到本地

启动
1 | start ./nginx.exe |

Linux 安装
在线安装
安装
1 | sudo apt install nginx |
查看 Nginx 版本
1 | nginx -v |
编译安装
安装编译环境
1 | apt install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev |
下载Nginx源码
进入官方下载地址,复制合适的适版本(nginx-xxx)。

使用wget下载:
1 | # 下载源码 |
编译
配置编译
1 | ./configure #使用默认编译 |
编译参数说明
–with开头的,默认是禁用的(没启动的,想使用的话需要在编译的时候加上)
–without开头的,默认是启用的(不想启用此模块时,可以在编译的时候加上这个参数)
–help
1 | 打印帮助信息。 |
–prefix=path
1 | 定义将保留服务器文件的目录。此相同目录还将用于设置的所有相对路径 configure(库源路径除外)和nginx.conf配置文件中。/usr/local/nginx默认情况下设置为目录。 |
–sbin-path=path
1 | 设置nginx可执行文件的名称。此名称仅在安装期间使用。默认情况下,文件名为 prefix/sbin/nginx。 |
–modules-path=path
1 | 定义将在其中安装nginx动态模块的目录。默认情况下使用prefix/modules目录。 |
–conf-path=path
1 | 设置nginx.conf配置文件的名称。如果需要,可以通过在命令行参数中指定nginx来始终使用其他配置文件来启动它 。默认情况下,文件名为 。 -c fileprefix/conf/nginx.conf |
–error-log-path=path
1 | 设置主要错误,警告和诊断文件的名称。安装后,可以始终nginx.conf使用error_log伪指令在配置文件中 更改文件名 。默认情况下,文件名为 prefix/logs/error.log。 |
–pid-path=path
1 | 设置nginx.pid将存储主进程的进程ID 的文件名。安装后,可以始终nginx.conf使用pid伪指令在配置文件中 更改文件名 。默认情况下,文件名为 prefix/logs/nginx.pid。 |
–lock-path=path
1 | 为锁定文件的名称设置前缀。安装后,可以始终nginx.conf使用lock_file伪指令在配置文件中 更改该值 。默认情况下,值为 prefix/logs/nginx.lock。 |
–user=name
1 | 设置一个非特权用户的名称,其凭据将由工作进程使用。安装后,可以始终nginx.conf使用用户指令在配置文件中 更改名称 。默认用户名是nobody。 |
–group=name
1 | 设置其凭据将由工作进程使用的组的名称。安装后,可以始终nginx.conf使用用户指令在配置文件中 更改名称 。默认情况下,组名称设置为非特权用户的名称。 |
–build=name
1 | 设置一个可选的nginx构建名称。 |
–builddir=path
1 | 设置构建目录。 |
–with-select_module 和 –without-select_module
1 | 启用或禁用构建允许服务器使用该select()方法的模块。如果平台似乎不支持kqueue,epoll或/ dev / poll等更合适的方法,则会自动构建此模块。 |
–with-poll_module 和 –without-poll_module
1 | 启用或禁用构建允许服务器使用该poll()方法的模块。如果平台似乎不支持kqueue,epoll或/ dev / poll等更合适的方法,则会自动构建此模块。 |
–with-threads
1 | 启用线程池的使用 。 |
–with-file-aio
1 | 支持 在FreeBSD和Linux上使用 异步文件I / O(AIO)。 |
–with-http_ssl_module
1 | 启用构建将HTTPS协议支持添加 到HTTP服务器的模块的功能。默认情况下未构建此模块。需要OpenSSL库来构建和运行此模块。 |
–with-http_v2_module
1 | 支持构建一个模块,该模块提供对HTTP / 2的支持 。默认情况下未构建此模块。 |
–with-http_realip_module
1 | 支持构建ngx_http_realip_module 模块,该 模块将客户端地址更改为在指定的标头字段中发送的地址。默认情况下未构建此模块。 |
–with-http_addition_module
1 | 允许构建ngx_http_addition_module 模块,该 模块在响应之前和之后添加文本。默认情况下未构建此模块。 |
–with-http_xslt_module 和 –with-http_xslt_module=dynamic
1 | 支持构建ngx_http_xslt_module 模块,该 模块使用一个或多个XSLT样式表转换XML响应。默认情况下未构建此模块。该libxml2的和 的libxslt库需要构建和运行此模块。 |
–with-http_image_filter_module 和 –with-http_image_filter_module=dynamic
1 | 支持构建ngx_http_image_filter_module 模块,该 模块可以转换JPEG,GIF,PNG和WebP格式的图像。默认情况下未构建此模块。 |
–with-http_geoip_module 和 –with-http_geoip_module=dynamic
1 | 支持构建ngx_http_geoip_module 模块,该 模块根据客户端IP地址和预编译的MaxMind数据库创建变量 。默认情况下未构建此模块。 |
–with-http_sub_module
1 | 支持构建ngx_http_sub_module 模块,该 模块通过将一个指定的字符串替换为另一个指定的字符串来修改响应。默认情况下未构建此模块。 |
–with-http_dav_module
1 | 支持构建ngx_http_dav_module 模块,该 模块通过WebDAV协议提供文件管理自动化。默认情况下未构建此模块。 |
–with-http_flv_module
1 | 支持构建ngx_http_flv_module 模块,该 模块为Flash Video(FLV)文件提供伪流服务器端支持。默认情况下未构建此模块。 |
–with-http_mp4_module
1 | 支持构建ngx_http_mp4_module 模块,该 模块为MP4文件提供伪流服务器端支持。默认情况下未构建此模块。 |
–with-http_gunzip_module
1 | 支持为不支持“ gzip”编码方法的客户端构建ngx_http_gunzip_module 模块,该 模块使用“ Content-Encoding: gzip” 解压缩响应。默认情况下未构建此模块。 |
–with-http_gzip_static_module
1 | 支持构建ngx_http_gzip_static_module 模块,该 模块支持发送.gz扩展名为“ ”的预压缩文件,而不是常规文件。默认情况下未构建此模块。 |
–with-http_auth_request_module
1 | 允许构建ngx_http_auth_request_module 模块,该 模块基于子请求的结果实现客户端授权。默认情况下未构建此模块。 |
–with-http_random_index_module
1 | 支持构建ngx_http_random_index_module 模块,该 模块处理以斜杠(' /')结尾的请求,并从目录中选择一个随机文件作为索引文件。默认情况下未构建此模块。 |
–with-http_secure_link_module
1 | 启用构建 ngx_http_secure_link_module 模块。默认情况下未构建此模块。 |
–with-http_degradation_module
1 | 启用构建 ngx_http_degradation_module模块。默认情况下未构建此模块。 |
–with-http_slice_module
1 | 支持构建ngx_http_slice_module 模块,该 模块将请求拆分为子请求,每个子请求返回一定范围的响应。该模块提供了更有效的大响应缓存。默认情况下未构建此模块。 |
–with-http_stub_status_module
1 | 支持构建ngx_http_stub_status_module 模块,该 模块提供对基本状态信息的访问。默认情况下未构建此模块。 |
–without-http_charset_module
1 | 禁用构建ngx_http_charset_module 模块,该 模块将指定的字符集添加到“ Content-Type”响应头字段中,并且可以将数据从一个字符集转换为另一个字符集。 |
–without-http_gzip_module
1 | 禁用构建可压缩 HTTP服务器响应的模块。zlib库是构建和运行此模块所必需的。 |
–without-http_ssi_module
1 | 禁用构建 处理通过SSI(服务器端包含)命令的 ngx_http_ssi_module模块的响应。 |
–without-http_userid_module
1 | 禁用构建ngx_http_userid_module 模块,该 模块设置适用于客户端标识的cookie。 |
–without-http_access_module
1 | 禁用构建ngx_http_access_module 模块,该 模块允许限制对某些客户端地址的访问。 |
–without-http_auth_basic_module
1 | 禁用构建ngx_http_auth_basic_module 模块,该 模块允许通过使用“ HTTP基本身份验证”协议验证用户名和密码来限制对资源的访问。 |
–without-http_mirror_module
1 | 禁用构建ngx_http_mirror_module 模块,该 模块通过创建后台镜像子请求来实现原始请求的镜像。 |
–without-http_autoindex_module
1 | 禁用构建 ngx_http_autoindex_module 模块,以处理以斜杠(' /')结尾的请求,并在ngx_http_index_module模块找不到索引文件的情况下生成目录列表 。 |
–without-http_geo_module
1 | 禁用构建ngx_http_geo_module 模块,该 模块创建的变量的值取决于客户端IP地址。 |
–without-http_map_module
1 | 禁用构建ngx_http_map_module 模块,该 模块创建的变量的值取决于其他变量的值。 |
–without-http_split_clients_module
1 | 禁用构建ngx_http_split_clients_module 模块,该 模块创建用于A / B测试的变量。 |
–without-http_referer_module
1 | 禁用构建ngx_http_referer_module 模块,该 模块可以阻止对“ Referer”标头字段中具有无效值的请求的站点访问。 |
–without-http_rewrite_module
1 | 禁用构建允许HTTP服务器 重定向请求并更改请求URI的模块。构建和运行此模块需要PCRE库。 |
–without-http_proxy_module
1 | 禁用构建HTTP服务器 代理模块。 |
–without-http_fastcgi_module
1 | 禁用构建 将请求传递到FastCGI服务器的 ngx_http_fastcgi_module模块。 |
–without-http_uwsgi_module
1 | 禁用构建 将请求传递到uwsgi服务器的 ngx_http_uwsgi_module模块。 |
–without-http_scgi_module
1 | 禁用构建 将请求传递到SCGI服务器的 ngx_http_scgi_module模块。 |
–without-http_grpc_module
1 | 禁用构建 将请求传递到gRPC服务器的 ngx_http_grpc_module模块。 |
–without-http_memcached_module
1 | 禁用构建ngx_http_memcached_module 模块,该 模块从memcached服务器获取响应。 |
–without-http_limit_conn_module
1 | 禁用构建ngx_http_limit_conn_module 模块,该 模块限制每个键的连接数,例如,单个IP地址的连接数。 |
–without-http_limit_req_module
1 | 禁用构建ngx_http_limit_req_module 模块,该 模块限制每个密钥的请求处理速率,例如,来自单个IP地址的请求的处理速率。 |
–without-http_empty_gif_module
1 | 禁用构建发出单像素透明GIF的模块 。 |
–without-http_browser_module
1 | 禁用构建ngx_http_browser_module 模块,该 模块创建的变量的值取决于“ User-Agent”请求标头字段的值。 |
–without-http_upstream_hash_module
1 | 禁用构建实现哈希 负载平衡方法的模块 。 |
–without-http_upstream_ip_hash_module
1 | 禁用构建实现ip_hash 负载平衡方法的模块 。 |
–without-http_upstream_least_conn_module
1 | 禁用构建实现了minimum_conn 负载平衡方法的模块 。 |
–without-http_upstream_keepalive_module
1 | 禁用构建一个模块来提供 对上游服务器连接的缓存。 |
–without-http_upstream_zone_module
1 | 禁用构建模块,该模块可以将上游组的运行时状态存储在共享内存 区域中。 |
–with-http_perl_module 和 –with-http_perl_module=dynamic
1 | 支持构建 嵌入式Perl模块。默认情况下未构建此模块。 |
–with-perl_modules_path=path
1 | 定义一个目录,该目录将保留Perl模块。 |
–with-perl=path
1 | 设置Perl二进制文件的名称。 |
–http-log-path=path
1 | 设置HTTP服务器的主请求日志文件的名称。安装后,可以始终nginx.conf使用access_log伪指令在配置文件中 更改文件名 。默认情况下,文件名为 prefix/logs/access.log。 |
–http-client-body-temp-path=path
1 | 定义用于存储包含客户端请求正文的临时文件的目录。安装后,可以始终nginx.conf使用client_body_temp_path 指令在配置文件中 更改目录 。默认情况下,目录名为 prefix/client_body_temp。 |
–http-proxy-temp-path=path
1 | 定义一个目录,用于存储包含从代理服务器接收到的数据的临时文件。安装后,可以始终nginx.conf使用proxy_temp_path 指令在配置文件中 更改目录 。默认情况下,目录名为 prefix/proxy_temp。 |
–http-fastcgi-temp-path=path
1 | 定义一个目录,用于存储包含从FastCGI服务器接收到的数据的临时文件。安装后,可以始终nginx.conf使用fastcgi_temp_path 指令在配置文件中 更改目录 。默认情况下,目录名为 prefix/fastcgi_temp。 |
–http-uwsgi-temp-path=path
1 | 定义一个目录,用于存储带有从uwsgi服务器接收到的数据的临时文件。安装后,可以始终nginx.conf使用uwsgi_temp_path 指令在配置文件中 更改目录 。默认情况下,目录名为 prefix/uwsgi_temp。 |
–http-scgi-temp-path=path
1 | 定义一个目录,用于存储带有从SCGI服务器接收到的数据的临时文件。安装后,可以始终nginx.conf使用scgi_temp_path 指令在配置文件中 更改目录 。默认情况下,目录名为 prefix/scgi_temp。 |
–without-http
1 | 禁用HTTP服务器。 |
–without-http-cache
1 | 禁用HTTP缓存。 |
–with-mail 和 –with-mail=dynamic
1 | 启用POP3 / IMAP4 / SMTP 邮件代理服务器。 |
–with-mail_ssl_module
1 | 支持构建一个模块,该模块 向邮件代理服务器添加 SSL / TLS协议支持。默认情况下未构建此模块。需要OpenSSL库来构建和运行此模块。 |
–without-mail_pop3_module
1 | 在邮件代理服务器中 禁用POP3协议。 |
–without-mail_imap_module
1 | 在邮件代理服务器中 禁用IMAP协议。 |
–without-mail_smtp_module
1 | 在邮件代理服务器中 禁用SMTP协议。 |
–with-stream 和 –with-stream=dynamic
1 | 支持构建 用于通用TCP / UDP代理和负载平衡的 流模块。默认情况下未构建此模块。 |
–with-stream_ssl_module
1 | 支持构建一个模块,该模块 向流模块添加 SSL / TLS协议支持。默认情况下未构建此模块。需要OpenSSL库来构建和运行此模块。 |
–with-stream_realip_module
1 | 启用构建ngx_stream_realip_module 模块的功能,该 模块将客户端地址更改为PROXY协议标头中发送的地址。默认情况下未构建此模块。 |
–with-stream_geoip_module 和 –with-stream_geoip_module=dynamic
1 | 支持构建ngx_stream_geoip_module 模块,该 模块根据客户端IP地址和预编译的MaxMind数据库创建变量 。默认情况下未构建此模块。 |
–with-stream_ssl_preread_module
1 | 支持构建ngx_stream_ssl_preread_module 模块,该 模块允许从ClientHello 消息中提取信息, 而无需终止SSL / TLS。默认情况下未构建此模块。 |
–without-stream_limit_conn_module
1 | 禁用构建ngx_stream_limit_conn_module 模块,该 模块限制每个键的连接数,例如,单个IP地址的连接数。 |
–without-stream_access_module
1 | 禁用构建ngx_stream_access_module 模块,该 模块允许限制对某些客户端地址的访问。 |
–without-stream_geo_module
1 | 禁用构建ngx_stream_geo_module 模块,该 模块创建的变量值取决于客户端IP地址。 |
–without-stream_map_module
1 | 禁用构建ngx_stream_map_module 模块,该 模块创建的变量值取决于其他变量的值。 |
–without-stream_split_clients_module
1 | 禁用构建ngx_stream_split_clients_module 模块,该 模块创建用于A / B测试的变量。 |
–without-stream_return_module
1 | 禁用构建ngx_stream_return_module 模块,该 模块向客户端发送一些指定的值,然后关闭连接。 |
–without-stream_upstream_hash_module
1 | 禁用构建实现哈希 负载平衡方法的模块 。 |
–without-stream_upstream_least_conn_module
1 | 禁用构建实现了minimum_conn 负载平衡方法的模块 。 |
–without-stream_upstream_zone_module
1 | 禁用构建模块,该模块可以将上游组的运行时状态存储在共享内存 区域中。 |
–with-google_perftools_module
1 | 允许构建ngx_google_perftools_module 模块,该 模块可以使用Google Performance Tools对nginx工作进程进行 性能分析。该模块适用于Nginx开发人员,默认情况下未构建。 |
–with-cpp_test_module
1 | 启用构建 ngx_cpp_test_module模块。 |
–add-module=path
1 | 启用外部模块。 |
–add-dynamic-module=path
1 | 启用外部动态模块。 |
–with-compat
1 | 启用动态模块兼容性。 |
–with-cc=path
1 | 设置C编译器的名称。 |
–with-cpp=path
1 | 设置C预处理器的名称。 |
–with-cc-opt=parameters
1 | 设置将添加到CFLAGS变量的其他参数。在FreeBSD下使用系统PCRE库时, --with-cc-opt="-I /usr/local/include" 应指定。如果select()需要增加支持的文件数量,也可以在此处指定,例如: --with-cc-opt="-D FD_SETSIZE=2048"。 |
–with-ld-opt=parameters
1 | 设置将在链接期间使用的其他参数。在FreeBSD下使用系统PCRE库时, --with-ld-opt="-L /usr/local/lib" 应指定。 |
–with-cpu-opt=cpu
1 | 每个指定的CPU能够使建筑: pentium,pentiumpro, pentium3,pentium4, athlon,opteron, sparc32,sparc64, ppc64。 |
–without-pcre
1 | 禁用PCRE库的使用。 |
–with-pcre
1 | 强制使用PCRE库。 |
–with-pcre=path
1 | 设置PCRE库源的路径。需要从PCRE站点下载并分发库分发(版本4.4 — 8.43) 。其余的由nginx的./configure和完成 make。该库对于location指令中的正则表达式支持和 ngx_http_rewrite_module 模块是必需的 。 |
–with-pcre-opt=parameters
1 | 为PCRE设置其他构建选项。 |
–with-pcre-jit
1 | 使用“及时编译”支持(1.1.12,pcre_jit指令)构建PCRE库 。 |
–with-zlib=path
1 | 设置zlib库源的路径。需要从zlib站点下载库发行版(版本1.1.3-1.2.11) 并解压缩。其余的由nginx的./configure和完成 make。ngx_http_gzip_module模块需要该库 。 |
–with-zlib-opt=parameters
1 | 为zlib设置其他构建选项。 |
–with-zlib-asm=cpu
1 | 使得能够使用指定的CPU中的一个优化的zlib汇编源程序: pentium,pentiumpro。 |
–with-libatomic
1 | 强制使用libatomic_ops库。 |
–with-libatomic=path
1 | 设置libatomic_ops库源的路径。 |
–with-openssl=path
1 | 设置OpenSSL库源的路径。 |
–with-openssl-opt=parameters
1 | 为OpenSSL设置其他构建选项。 |
–with-debug
1 | 启用调试日志。 |
编译
1 | make |
安装
1 | make install |
查找安装路径: whereis nginx

启动
1 | cd /usr/local/nginx/sbin |
注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口或者直接清除服务器防火墙所有规则,并将默认策略设置为接受所有流量:
1 | sudo iptables -F |
如果你使用的是firewalld作为防火墙软件,可以使用以下命令来关闭防火墙:
1 | sudo systemctl stop firewalld |
第一条命令将停止firewalld服务,第二条命令将禁用firewalld服务,确保在系统重启后防火墙不会自动启动。
相关命令:
1 | # 开启 |
Docker安装
官方文档:https://hub.docker.com/_/nginx
安装命令:
1 | docker run \ |
卸载
停止 Nginx 软件
可以通过执行ps命令找到nginx程序的PID,然后kill其PID
1 | ps -aux | grep nginx # 查询nginx的PID |
查找根下所有名字包含nginx的文件
1 | find / -name nginx |
执行命令 rm -rf * 删除nignx安装的相关文件
1 | rm -rf /usr/local/sbin/nginx |
如果设置了Nginx开机自启动的话,可能还需要下面两步
1 | chkconfig nginx off |
Nginx常用命令
1 | nginx -s stop # 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。 |
Nginx配置
Nginx 大多数功能都可以通过修改配置文件来完成,使用者只需要简单修改一下nginx配置文件,便可以非常轻松的实现比如反向代理,负载均衡这些常用的功能
nginx配置文件默认都放在nginx安装路径下的conf目录,大多数情况下只需要修改主配置文件nginx.conf即可
nginx.conf 这个文件中的内容按照功能划分,我们通常将nginx配置文件分为三大块:全局块,events块,http块。
全局块
1 | user nginx; |
主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如 worker_processes auto; 这一行,worker_processes 值越大,我们nginx可支持的并发数量就越多,很多人想这不就爽了吗,我设置成正无穷,无限并发flag达成,秒杀问题轻松解决,这个,受自己服务器硬件限制的,不能乱来。
events 块
1 | events { |
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
http块
1 | http { |
注意:http是一个大块,里面也可以包括很多小块,比如http全局块,server块等。
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
而http块中的server块则相当于一个虚拟主机,一个http块可以拥有多个server块。
server块又包括全局server块,和location块。
全局server块主要包括了本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
location块则用来对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。比如,对/usr相关的请求交给8080来处理,/admin则较给8081处理。
Nginx配置实战
配置文件实例
以下为一个 nginx.conf 配置文件实例:
1 | #定义 nginx 运行的用户和用户组 |
正向代理
正向代理类似一个跳板机,代理访问外部资源
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

正向代理的用途:
- 访问原来无法访问的资源,如google
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

反向代理的作用:
- 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
一句话总结正向代理与方向代理的区别:
- 正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端
- 反向代理即是服务端代理,代理服务端,客户端不知道实际提供服务的服务端.
http 反向代理
反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
nginx.conf 配置文件如下:
1 | #运行用户 |
location指令说明:
功能:用于匹配URL
语法如下:
1 | 1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 |
https 反向代理
使用 nginx 配置 https 需要知道几点:
- HTTPS 的固定端口号是 443,不同于 HTTP 的 80 端口
- SSL 标准需要引入安全证书,所以在 nginx.conf 中你需要指定证书和它对应的 key
其他和 http 反向代理基本一样,只是在 Server 部分配置有些不同。
1 | #HTTP服务器 |
负载均衡
前面的例子中,代理仅仅指向一个服务器。
但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。
nginx 也可以实现简单的负载均衡功能。

假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.helloworld.com,公网 IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理(下面例子中使用的是加权轮询策略)。
nginx.conf 配置如下:
1 | http { |
负载均衡策略
轮询

1 | upstream bck_testing_01 { |
加权轮询

1 | upstream bck_testing_01 { |
最少连接
1 | upstream bck_testing_01 { |
加权最少连接
1 | upstream bck_testing_01 { |
IP Hash
对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

1 | upstream bck_testing_01 { |
普通 Hash
1 | upstream bck_testing_01 { |
网站有多个 webapp 的配置
当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。
举个例子:假如 www.helloworld.com 站点有好几个 webapp,finance(金融)、product(产品)、admin(用户中心)。访问这些应用的方式通过上下文(context)来进行区分:
我们知道,http 的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp 应用,都用 80 端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。
那么,问题来了,用户在实际访问 www.helloworld.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。
1 | http { |
动静分离
在我们的开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。

弄好一个动态资源一个静态资源:比如
- /shisan/image/01.jpg
- /shisan/html/01.html
1 | server { |
防盗链
1 | # 在动静分离的location中开启防盗链机制 |
静态站点
有时候,我们需要配置静态站点(即 html 文件和一堆静态资源)。
举例来说:如果所有的静态资源都放在了 /app/dist 目录下,我们只需要在 nginx.conf 中指定首页以及这个站点的 host 即可。
配置如下:
1 | worker_processes 1; |
然后,添加 HOST:
127.0.0.1 aaa.bbb.com
此时,在本地浏览器访问 aaa.bbb.com ,就可以访问静态站点了。
搭建文件服务器
有时候,团队需要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。
Nginx 中的配置要点:
- 将 autoindex 开启可以显示目录,默认不开启。
- 将 autoindex_exact_size 开启可以显示文件的大小。
- 将 autoindex_localtime 开启可以显示文件的修改时间。
- root 用来设置开放为文件服务的根路径。
- charset 设置为
charset utf-8,gbk;,可以避免中文乱码问题(windows 服务器下设置后,依然乱码,本人暂时没有找到解决方法)。
一个最简化的配置如下:
1 | autoindex on;# 显示目录 |
跨域配置
在后端服务器设置 HTTP 响应头,把你需要允许访问的域名加入 Access-Control-Allow-Origin 中。
首先,在 enable-cors.conf 文件中设置 cors :
1 | server { |
访问ip白名单
如果想对整个Nginx下所有网站设置IP访问白名单,可以配置在http段中,如:仅允许10.10.10.10的访问,其他所有IP均不能访问。
1 | http { |
允许10.10.10.11和10.10.10.55访问blog.whsir.com域名,可直接在对应域名的server字段中配置:
1 | server { |
注:如果http字段和server字段同时配置了多个allow的IP,server字段中的allow也会生效,当然server字段中的allow仅对当前server域名生效。
仅允许10.10.10.0~10.10.10.255对某个URI地址进行访问:
1 | location /text/login { |
访问ip黑名单
同白名单的写法一样,只是关键字不一样,白名单是allow,黑名单是deny
1 | location / { |
黑名单设置,deny后面接限制的IP,不用加 allow all ,因为这个默认是开启的。
隐藏 Nginx 版本信息
1 | http { |
禁止ip直接访问80端口
1 | server { |
启动 web 服务 (vue 项目为例)
1 | server { |
PC端和移动端使用不同的项目文件映射
1 | server { |
一个web服务,配置多个项目 (location 匹配路由区别)
1 | server { |
SSL 配置 HTTPS
先去CA机构或从云控制台中申请对应的
SSL证书,审核通过后下载Nginx版本的证书。下载数字证书后,完整的文件总共有三个:
.crt、.key、.pem:.crt:数字证书文件,.crt是.pem的拓展文件,因此有些人下载后可能没有。.key:服务器的私钥文件,及非对称加密的私钥,用于解密公钥传输的数据。.pem:Base64-encoded编码格式的源证书文本文件,可自行根需求修改拓展名。
在
Nginx目录下新建certificate目录,并将下载好的证书/私钥等文件上传至该目录。
④最后修改一下nginx.conf文件即可,如下:
1 | # ----------HTTPS配置----------- |
重写
1 | server { |
重定向
1 | server { |
缓存配置
1 | server { |
gzip压缩配置
1 | server { |
身份验证
1 | location / { |
auth_basic "closed site"中的``closed site`是弹出框(输入用户名和密码)的标题。
auth_basic_user_file /usr/local/nginx/conf/htpasswd; 中的``/usr/local/nginx/conf/htpasswd`是保存密码的文件。
密码文件生成,需要``apt install mini-httpd -y`
1 | htpasswd -c /usr/local/nginx/conf/htpasswd 用户名 |
如果要添加或者修改另一个用户的密码,只需要省略-c选项
1 | htpasswd /usr/local/nginx/conf/htpasswd 用户名 |
如果要删除一个用户的密码,只需要加-D选项
1 | htpasswd -D /usr/local/nginx/conf/htpasswd 用户名 |
配置好后,重启,应该就可以了。
视频推流
下载模块
将模块放在/usr/local/src/目录下
1 | git clone https://github.com/arut/nginx-rtmp-module.git |
配置编译参数
在nginx源代码目录下,运行以下命令:
1 | ./configure --add-module=/usr/local/src/nginx-rtmp-module |
配置nginx-rtmp
1 | rtmp { |
其中,listen指定了RTMP服务器监听的端口,chunk_size设置数据包大小,live开启直播流,record关闭录制。
push指令即为用于推送的指令,可以将数据流推送到Bilibili的RTMP服务。在指令中,直播码是在Bilibili申请直播时得到的,streamname指定流名称,key指定直播的密码密钥。
高可用
实现效果:
准备两台 nginx 服务器,通过浏览器地址栏访问虚拟 ip 地址,把主服务器的 nginx 停止,再次访问虚拟 ip 地址仍旧有效。
具体配置:
(1)在两台 nginx 服务器上安 keepalived。
keepalived 相当于一个路由,它通过一个脚本来检测当前服务器是否还活着,如果还活着则继续访问,否则就切换到另一台备份服务器。
下载安装包
在 https://www.keepalived.org/download.html 寻找合适的版本
1 | # 下载 |
编译
1 | ./configure |
安装
1 | make && make install |
(2)修改主备服务器 /etc/keepalived/keepalivec.conf 配置文件(可直接替换),完成高可用主从配置。
keepalived 将 nginx 服务器绑定到一个虚拟 ip , nginx 高可用集群对外统一暴露这个虚拟 ip,客户端都是通过访问这个虚拟 ip 来访问 nginx 服务器 。
1 | global_defs { |
字段说明
- router_id: 在 /etc/hosts 文件中配置,通过它能访问到我们的主机。
1 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 |
- interval: 设置脚本执行的间隔时间
- weight: 当脚本执行失败即 keepalived 或 nginx 挂掉时,权重增加的值(可为负数)。
- interface: 输入
ifconfig命令查看当前的网卡名是什么。
1 | ens7f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
(3)在 /usr/local/src 目录下添加检测脚本 nginx_check.sh。
1 | #!/bin/bash |
(4)启动两台服务器的 nginx 和 keepalived。
1 | # 启动 nginx |
(5)查看虚拟 ip 地址 ip a 。把主服务器 192.168.4.32 nginx 和 keepalived停止,再访问虚拟 ip 查看高可用效果。