目录
- 01-如何查看 Nginx-nginx-1.18.0编译时默认包含哪些模块?
- 02-如何查看Nginx有哪些自己可以手动设置添加或不添加的模块
- 03-各配置语句和模块功能简介
- 03-001:`--pid-path=PATH`
- 03-002:`--lock-path=PATH `
- 03-003:`select_module `
- 03-004:`poll_module `
- 03-005:`threads`
- 03-006:`file-aio `
- 03-007:`http_ssl_module`
- 03-008:`http_v2_module `
- 03-009:`http_realip_module`
- 03-010:`http_addition_module `
- 03-011:`http_xslt_module`
- 03-012:`http_xslt_module=dynamic`
- 03-013:`http_image_filter_module`---Nginx的图像处理
- 03-014:`http_image_filter_module=dynamic`
- 03-015:`http_geoip_module`
- 03-016:`http_sub_module`---替换响应内容
- 03-017:`http_dav_modul`
- 03-018:`http_flv_module`
- 03-019:`http_mp4_module`
- 03-020:`http_gunzip_module`
- 03-021:`http_gzip_static_module`
- 03-022:`http_auth_request_module`---身份验证功能模块
- 03-023:`http_random_index_module`
- 03-024:`http_secure_link_module`
- 03-025:`http_degradation_module`---防止Nginx对服务器的内存过度使用
- 03-026:`http_slice_module`
- 03-027:`http_stub_status_module`-Nginx运行状态监控页面
- 03-028:`http_charset_module`
- 03-029:`http_gzip_module`
- 03-030:`http_ssi_module`
- 03-031:`http_userid_module`
- 03-032:`http_access_module`
- 03-033:`http_auth_basic_modul`---对受保护的资源加上用户名和密码
- 03-034:`http_mirror_module `---将客户端请求同时转发到镜像服务器,以进行开发测试
- 03-035:`http_autoindex_module`---自动生成目录下的文件列表
- 03-036:`http_geo_module`
- 03-037:`http_map_module`
- 03-038:`http_split_clients_module`
- 03-038:`http_referer_module`
- 03-039:`http_rewrite_module`
- 03-040:`http_proxy_module`
- 03-041:`http_fastcgi_module`
- 03-042:`http_uwsgi_module`
- 03-043:`http_scgi_module`
- 03-044:`http_grpc_module`
- 03-045:`http_memcached_module`
- 03-046:`http_limit_conn_module`
- 03-047:`http_limit_req_module`
- 03-048:`http_empty_gif_module`
- 03-049:`http_browser_module`
- 03-050:`http_upstream_hash_module`
- 03-051:`http_upstream_ip_hash_module`
- 03-052:`http_upstream_least_conn_module`---根据连接数进行负载均衡
- 03-053:`http_upstream_random_module`
- 03-054:`http_upstream_keepalive_module`
- 03-056:`http_upstream_zone_module`
- 03-057:`http_perl_module`
- 03-058:`--without-http`
- 03-059:`with-mail`
- 03-060:`with-stream`-处理非 HTTP 协议的流量
- 03-061:`google_perftools_module`
- 03-062:`cpp_test_module `
- 03-063:`--add-module=PATH`
- 03-064:`--with-compat`
- 03-065:`--with-pcre`
- 03-066:`--with-zlib=DIR `
- 03-067:`--with-libatomic`
- 03-068:`--with-openssl=DIR`
- 03-069:`--with-debug`
01-如何查看 Nginx-nginx-1.18.0编译时默认包含哪些模块?
如果你想查看编译配置选项的默认设置,可以运行下面的两条命令:
对编译进行配置,不手动设置对任何模块的添加和删除:
./configure --prefix=/usr/local/nginx
然后进行编译
make
编译完成后会显示编译了哪些模块,如下图所示:
值得注意的是:编译出来的目标文件的名字与configure中使用的模块名可以是不一样的。
比如对于模块http_geo,虽然在configure的help命令中它的名字是:http_geo_module,但是实际上它最终编译出来的目标文件的名字为 ngx_http_geo_module.o
,我实测了下,如果要不包含这个模块,需要下面的命令:
--without-http_geo_module
这就充分说明编译出来的目标文件的名字与configure中使用的模块名可以是不一样的。
完整信息如下:
objs/src/core/nginx.o \
objs/src/core/ngx_log.o \
objs/src/core/ngx_palloc.o \
objs/src/core/ngx_array.o \
objs/src/core/ngx_list.o \
objs/src/core/ngx_hash.o \
objs/src/core/ngx_buf.o \
objs/src/core/ngx_queue.o \
objs/src/core/ngx_output_chain.o \
objs/src/core/ngx_string.o \
objs/src/core/ngx_parse.o \
objs/src/core/ngx_parse_time.o \
objs/src/core/ngx_inet.o \
objs/src/core/ngx_file.o \
objs/src/core/ngx_crc32.o \
objs/src/core/ngx_murmurhash.o \
objs/src/core/ngx_md5.o \
objs/src/core/ngx_sha1.o \
objs/src/core/ngx_rbtree.o \
objs/src/core/ngx_radix_tree.o \
objs/src/core/ngx_slab.o \
objs/src/core/ngx_times.o \
objs/src/core/ngx_shmtx.o \
objs/src/core/ngx_connection.o \
objs/src/core/ngx_cycle.o \
objs/src/core/ngx_spinlock.o \
objs/src/core/ngx_rwlock.o \
objs/src/core/ngx_cpuinfo.o \
objs/src/core/ngx_conf_file.o \
objs/src/core/ngx_module.o \
objs/src/core/ngx_resolver.o \
objs/src/core/ngx_open_file_cache.o \
objs/src/core/ngx_crypt.o \
objs/src/core/ngx_proxy_protocol.o \
objs/src/core/ngx_syslog.o \
objs/src/event/ngx_event.o \
objs/src/event/ngx_event_timer.o \
objs/src/event/ngx_event_posted.o \
objs/src/event/ngx_event_accept.o \
objs/src/event/ngx_event_udp.o \
objs/src/event/ngx_event_connect.o \
objs/src/event/ngx_event_pipe.o \
objs/src/os/unix/ngx_time.o \
objs/src/os/unix/ngx_errno.o \
objs/src/os/unix/ngx_alloc.o \
objs/src/os/unix/ngx_files.o \
objs/src/os/unix/ngx_socket.o \
objs/src/os/unix/ngx_recv.o \
objs/src/os/unix/ngx_readv_chain.o \
objs/src/os/unix/ngx_udp_recv.o \
objs/src/os/unix/ngx_send.o \
objs/src/os/unix/ngx_writev_chain.o \
objs/src/os/unix/ngx_udp_send.o \
objs/src/os/unix/ngx_udp_sendmsg_chain.o \
objs/src/os/unix/ngx_channel.o \
objs/src/os/unix/ngx_shmem.o \
objs/src/os/unix/ngx_process.o \
objs/src/os/unix/ngx_daemon.o \
objs/src/os/unix/ngx_setaffinity.o \
objs/src/os/unix/ngx_setproctitle.o \
objs/src/os/unix/ngx_posix_init.o \
objs/src/os/unix/ngx_user.o \
objs/src/os/unix/ngx_dlopen.o \
objs/src/os/unix/ngx_process_cycle.o \
objs/src/os/unix/ngx_linux_init.o \
objs/src/event/modules/ngx_epoll_module.o \
objs/src/os/unix/ngx_linux_sendfile_chain.o \
objs/src/core/ngx_regex.o \
objs/src/http/ngx_http.o \
objs/src/http/ngx_http_core_module.o \
objs/src/http/ngx_http_special_response.o \
objs/src/http/ngx_http_request.o \
objs/src/http/ngx_http_parse.o \
objs/src/http/modules/ngx_http_log_module.o \
objs/src/http/ngx_http_request_body.o \
objs/src/http/ngx_http_variables.o \
objs/src/http/ngx_http_script.o \
objs/src/http/ngx_http_upstream.o \
objs/src/http/ngx_http_upstream_round_robin.o \
objs/src/http/ngx_http_file_cache.o \
objs/src/http/ngx_http_write_filter_module.o \
objs/src/http/ngx_http_header_filter_module.o \
objs/src/http/modules/ngx_http_chunked_filter_module.o \
objs/src/http/modules/ngx_http_range_filter_module.o \
objs/src/http/modules/ngx_http_gzip_filter_module.o \
objs/src/http/ngx_http_postpone_filter_module.o \
objs/src/http/modules/ngx_http_ssi_filter_module.o \
objs/src/http/modules/ngx_http_charset_filter_module.o \
objs/src/http/modules/ngx_http_userid_filter_module.o \
objs/src/http/modules/ngx_http_headers_filter_module.o \
objs/src/http/ngx_http_copy_filter_module.o \
objs/src/http/modules/ngx_http_not_modified_filter_module.o \
objs/src/http/modules/ngx_http_static_module.o \
objs/src/http/modules/ngx_http_autoindex_module.o \
objs/src/http/modules/ngx_http_index_module.o \
objs/src/http/modules/ngx_http_mirror_module.o \
objs/src/http/modules/ngx_http_try_files_module.o \
objs/src/http/modules/ngx_http_auth_basic_module.o \
objs/src/http/modules/ngx_http_access_module.o \
objs/src/http/modules/ngx_http_limit_conn_module.o \
objs/src/http/modules/ngx_http_limit_req_module.o \
objs/src/http/modules/ngx_http_geo_module.o \
objs/src/http/modules/ngx_http_map_module.o \
objs/src/http/modules/ngx_http_split_clients_module.o \
objs/src/http/modules/ngx_http_referer_module.o \
objs/src/http/modules/ngx_http_rewrite_module.o \
objs/src/http/modules/ngx_http_proxy_module.o \
objs/src/http/modules/ngx_http_fastcgi_module.o \
objs/src/http/modules/ngx_http_uwsgi_module.o \
objs/src/http/modules/ngx_http_scgi_module.o \
objs/src/http/modules/ngx_http_memcached_module.o \
objs/src/http/modules/ngx_http_empty_gif_module.o \
objs/src/http/modules/ngx_http_browser_module.o \
objs/src/http/modules/ngx_http_upstream_hash_module.o \
objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \
objs/src/http/modules/ngx_http_upstream_least_conn_module.o \
objs/src/http/modules/ngx_http_upstream_random_module.o \
objs/src/http/modules/ngx_http_upstream_keepalive_module.o \
objs/src/http/modules/ngx_http_upstream_zone_module.o \
objs/ngx_modules.o \
以下就是Nginx默认包含的模块。
02-如何查看Nginx有哪些自己可以手动设置添加或不添加的模块
可以使用命令:
./configure --help
查看有哪些自己可以手动设置添加或不添加的模块。
注意:在列出的信息中,以“with”开头或以“without”开头,并不能说明是默认包含或不包含,只是说明这个模块是大家经常添加还是不添加而已,当然也是一种语法举例。
运行 ./configure --help
命令的结果如下:
./configure --help
[root@geoiptest03 nginx-1.18.0]# ./configure --help--help print this message--prefix=PATH set installation prefix--sbin-path=PATH set nginx binary pathname--modules-path=PATH set modules path--conf-path=PATH set nginx.conf pathname--error-log-path=PATH set error log pathname--pid-path=PATH set nginx.pid pathname--lock-path=PATH set nginx.lock pathname--user=USER set non-privileged user forworker processes--group=GROUP set non-privileged group forworker processes--build=NAME set build name--builddir=DIR set build directory--with-select_module enable select module--without-select_module disable select module--with-poll_module enable poll module--without-poll_module disable poll module--with-threads enable thread pool support--with-file-aio enable file AIO support--with-http_ssl_module enable ngx_http_ssl_module--with-http_v2_module enable ngx_http_v2_module--with-http_realip_module enable ngx_http_realip_module--with-http_addition_module enable ngx_http_addition_module--with-http_xslt_module enable ngx_http_xslt_module--with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module--with-http_image_filter_module enable ngx_http_image_filter_module--with-http_image_filter_module=dynamicenable dynamic ngx_http_image_filter_module--with-http_geoip_module enable ngx_http_geoip_module--with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module--with-http_sub_module enable ngx_http_sub_module--with-http_dav_module enable ngx_http_dav_module--with-http_flv_module enable ngx_http_flv_module--with-http_mp4_module enable ngx_http_mp4_module--with-http_gunzip_module enable ngx_http_gunzip_module--with-http_gzip_static_module enable ngx_http_gzip_static_module--with-http_auth_request_module enable ngx_http_auth_request_module--with-http_random_index_module enable ngx_http_random_index_module--with-http_secure_link_module enable ngx_http_secure_link_module--with-http_degradation_module enable ngx_http_degradation_module--with-http_slice_module enable ngx_http_slice_module--with-http_stub_status_module enable ngx_http_stub_status_module--without-http_charset_module disable ngx_http_charset_module--without-http_gzip_module disable ngx_http_gzip_module--without-http_ssi_module disable ngx_http_ssi_module--without-http_userid_module disable ngx_http_userid_module--without-http_access_module disable ngx_http_access_module--without-http_auth_basic_module disable ngx_http_auth_basic_module--without-http_mirror_module disable ngx_http_mirror_module--without-http_autoindex_module disable ngx_http_autoindex_module--without-http_geo_module disable ngx_http_geo_module--without-http_map_module disable ngx_http_map_module--without-http_split_clients_module disable ngx_http_split_clients_module--without-http_referer_module disable ngx_http_referer_module--without-http_rewrite_module disable ngx_http_rewrite_module--without-http_proxy_module disable ngx_http_proxy_module--without-http_fastcgi_module disable ngx_http_fastcgi_module--without-http_uwsgi_module disable ngx_http_uwsgi_module--without-http_scgi_module disable ngx_http_scgi_module--without-http_grpc_module disable ngx_http_grpc_module--without-http_memcached_module disable ngx_http_memcached_module--without-http_limit_conn_module disable ngx_http_limit_conn_module--without-http_limit_req_module disable ngx_http_limit_req_module--without-http_empty_gif_module disable ngx_http_empty_gif_module--without-http_browser_module disable ngx_http_browser_module--without-http_upstream_hash_moduledisable ngx_http_upstream_hash_module--without-http_upstream_ip_hash_moduledisable ngx_http_upstream_ip_hash_module--without-http_upstream_least_conn_moduledisable ngx_http_upstream_least_conn_module--without-http_upstream_random_moduledisable ngx_http_upstream_random_module--without-http_upstream_keepalive_moduledisable ngx_http_upstream_keepalive_module--without-http_upstream_zone_moduledisable ngx_http_upstream_zone_module--with-http_perl_module enable ngx_http_perl_module--with-http_perl_module=dynamic enable dynamic ngx_http_perl_module--with-perl_modules_path=PATH set Perl modules path--with-perl=PATH set perl binary pathname--http-log-path=PATH set http access log pathname--http-client-body-temp-path=PATH set path to storehttp client request body temporary files--http-proxy-temp-path=PATH set path to storehttp proxy temporary files--http-fastcgi-temp-path=PATH set path to storehttp fastcgi temporary files--http-uwsgi-temp-path=PATH set path to storehttp uwsgi temporary files--http-scgi-temp-path=PATH set path to storehttp scgi temporary files--without-http disable HTTP server--without-http-cache disable HTTP cache--with-mail enable POP3/IMAP4/SMTP proxy module--with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module--with-mail_ssl_module enable ngx_mail_ssl_module--without-mail_pop3_module disable ngx_mail_pop3_module--without-mail_imap_module disable ngx_mail_imap_module--without-mail_smtp_module disable ngx_mail_smtp_module--with-stream enable TCP/UDP proxy module--with-stream=dynamic enable dynamic TCP/UDP proxy module--with-stream_ssl_module enable ngx_stream_ssl_module--with-stream_realip_module enable ngx_stream_realip_module--with-stream_geoip_module enable ngx_stream_geoip_module--with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module--with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module--without-stream_limit_conn_module disable ngx_stream_limit_conn_module--without-stream_access_module disable ngx_stream_access_module--without-stream_geo_module disable ngx_stream_geo_module--without-stream_map_module disable ngx_stream_map_module--without-stream_split_clients_moduledisable ngx_stream_split_clients_module--without-stream_return_module disable ngx_stream_return_module--without-stream_upstream_hash_moduledisable ngx_stream_upstream_hash_module--without-stream_upstream_least_conn_moduledisable ngx_stream_upstream_least_conn_module--without-stream_upstream_random_moduledisable ngx_stream_upstream_random_module--without-stream_upstream_zone_moduledisable ngx_stream_upstream_zone_module--with-google_perftools_module enable ngx_google_perftools_module--with-cpp_test_module enable ngx_cpp_test_module--add-module=PATH enable external module--add-dynamic-module=PATH enable dynamic external module--with-compat dynamic modules compatibility--with-cc=PATH set C compiler pathname--with-cpp=PATH set C preprocessor pathname--with-cc-opt=OPTIONS set additional C compiler options--with-ld-opt=OPTIONS set additional linker options--with-cpu-opt=CPU build for the specified CPU, valid values:pentium, pentiumpro, pentium3, pentium4,athlon, opteron, sparc32, sparc64, ppc64--without-pcre disable PCRE library usage--with-pcre force PCRE library usage--with-pcre=DIR set path to PCRE library sources--with-pcre-opt=OPTIONS set additional build options for PCRE--with-pcre-jit build PCRE with JIT compilation support--with-zlib=DIR set path to zlib library sources--with-zlib-opt=OPTIONS set additional build options for zlib--with-zlib-asm=CPU use zlib assembler sources optimizedfor the specified CPU, valid values:pentium, pentiumpro--with-libatomic force libatomic_ops library usage--with-libatomic=DIR set path to libatomic_ops library sources--with-openssl=DIR set path to OpenSSL library sources--with-openssl-opt=OPTIONS set additional build options for OpenSSL--with-debug enable debug logging
03-各配置语句和模块功能简介
03-001:--pid-path=PATH
--pid-path=PATH
是 Nginx 配置选项之一,用于指定 Nginx 主进程(master process)的 PID 文件的存放路径。PID 文件包含 Nginx 主进程的进程 ID(PID)。
具体来说,--pid-path
选项允许你指定一个路径,将 Nginx 主进程的 PID 文件保存在该路径下。例如:
./configure --pid-path=/var/run/nginx/nginx.pid
上述命令会将 Nginx 主进程的 PID 文件保存在 /var/run/nginx/nginx.pid
文件中。
主要作用有两点:
-
进程管理: PID 文件通常被用于进程管理,例如启动、停止或重新加载 Nginx 进程。系统管理员可以使用 PID 文件来了解 Nginx 主进程的当前进程 ID,从而执行诸如关闭或重新加载配置等操作。
-
监控和诊断: 在某些情况下,监控工具或诊断脚本可能需要获取 Nginx 主进程的 PID 以进行进程状态的监视或故障排查。
注意事项:
- 如果不指定
--pid-path
,Nginx 会将 PID 文件保存在默认的路径,通常是/usr/local/nginx/logs/nginx.pid
或类似的路径,具体取决于你的 Nginx 安装目录。 - 确保指定的路径对 Nginx 进程是可写的,否则 Nginx 在启动时可能无法创建 PID 文件。
- 建议将 PID 文件保存在一个易于管理的目录中,以便在需要时轻松找到。
03-002:--lock-path=PATH
--lock-path=PATH
是 Nginx 配置选项之一,用于指定 Nginx 主进程使用的文件锁的存放路径。这个文件锁是为了确保在同一时间只有一个 Nginx 主进程在运行。
具体来说,--lock-path
选项允许你指定一个路径,将 Nginx 主进程的锁文件保存在该路径下。例如:
./configure --lock-path=/var/lock/nginx.lock
上述命令会将 Nginx 主进程的锁文件保存在 /var/lock/nginx.lock
文件中。
主要作用有两点:
-
进程间同步: 多个进程访问共享资源时,通过文件锁可以实现进程间的同步,确保在同一时刻只有一个进程可以操作共享资源。在 Nginx 中,这主要用于防止多个主进程同时启动。
-
避免启动冲突: 当多个 Nginx 主进程试图启动时,它们会尝试获取文件锁。只有成功获取锁的进程才能继续启动,而其他进程则必须等待。这有助于避免启动冲突,确保只有一个 Nginx 进程能够掌握主导权。
注意事项:
- 如果不指定
--lock-path
,Nginx 会将锁文件保存在默认的路径,通常是/usr/local/nginx/logs/nginx.lock
或类似的路径,具体取决于你的 Nginx 安装目录。 - 确保指定的路径对 Nginx 进程是可写的,否则 Nginx 在启动时可能无法创建锁文件。
- 锁文件的存在与否可以被用于判断 Nginx 主进程是否正在运行,因为只有当 Nginx 主进程在运行时,锁文件才会存在。
03-003:select_module
不需要手动设置,因为Nginx自动会根据操作系统等因素进行选择。
select_module
是 Nginx 的一个编译选项,用于启用 select
模块。这个模块允许 Nginx 使用 select
系统调用进行事件处理。
事件处理是 Nginx 中非常重要的概念,用于处理诸如网络连接、定时器等异步事件。select
模块是 Nginx 的一种事件驱动模块,它使用 select
系统调用来管理并处理事件。
具体来说,select_module
选项的作用如下:
-
启用
select
模块: 通过指定这个选项,你告诉 Nginx 在编译时包含select
模块的支持。 -
事件处理:
select
模块使用select
系统调用来监视多个文件描述符的状态,以确定是否有可读、可写或异常事件发生。这对于处理大量并发连接是非常有用的。
请注意,select
模块通常不是在高负载和高并发场景下的最佳选择,因为 select
在文件描述符数量较大时性能可能受到限制。对于更高性能的需求,通常会选择使用更先进的事件模型,例如 epoll
(在 Linux 中)、kqueue
(在 BSD 系统中)、或者 poll
,这些都是支持更高并发连接的事件处理机制。
在实际使用时,根据你的操作系统和需求,你可能需要选择适当的事件模块,而不仅仅是 select
。 Nginx 默认会尝试选择最适合你系统的事件模块,但你可以通过明确指定 `` 系列选项来控制编译过程。
总结起来:就是这两个选项不用去管,Nginx在编译时自己会去选择,而且在在 Linux 中通常它会自动选择epoll
。
03-004:poll_module
不需要手动设置,因为Nginx自动会根据操作系统等因素进行选择。
这个看明白了 03-003 点就知道了,所以此处省略介绍。
03-005:threads
需要手动添加上,默认是没有包含的。
threads
是 Nginx 的编译选项之一,用于启用对线程的支持。在 Nginx 中,线程支持是指服务器能够利用多线程来处理请求,以提高并发性能。
具体来说,threads
选项的作用如下:
-
启用线程支持: 通过指定这个选项,你告诉 Nginx 在编译时包含对线程的支持。这允许 Nginx 利用操作系统提供的线程机制来处理请求。
-
并发处理: 线程支持使得 Nginx 能够同时处理多个请求,每个请求可以在一个独立的线程中执行。这有助于提高服务器的并发性能,特别是在面对大量并发连接的情况下。
需要注意的是,线程支持在 Nginx 中是一个相对较新的特性,而且其行为可能因操作系统的不同而有所差异。在一些传统的 Nginx 部署中,通常是使用多进程而不是多线程来处理并发连接。多进程模型更容易实现和维护,而且通常对于 Nginx 的高性能要求已经足够。
如果你选择启用 threads
,请确保你的 Nginx 版本支持线程,并在你的操作系统中进行适当的配置。此外,线程支持的行为和性能可能受到操作系统和 Nginx 版本的影响,因此在实际部署前最好进行一些测试和调优。
注意:nginx-1.18.0默认是没有启用线程支持的,如果需要启用,需要在配置时指定一下。
进程和线程有什么区别?
进程(Process)和线程(Thread)是计算机科学中两个重要的概念,它们表示计算机中执行的基本单元,但它们有一些关键的区别:
-
定义:
- 进程: 进程是程序的一次执行,是一个独立的执行环境。每个进程都有独立的内存空间,包括代码、数据和系统资源。
- 线程: 线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享相同的内存空间和系统资源,但拥有独立的执行路径。
-
资源分配:
- 进程: 进程是独立的资源单元,有自己的内存空间、文件句柄等。进程之间的通信通常需要特殊的机制,如进程间通信(Inter-Process Communication,IPC)。
- 线程: 线程是进程内的资源共享单元,多个线程可以共享相同的数据和上下文。线程之间的通信相对容易,因为它们共享相同的地址空间。
-
创建和销毁的开销:
- 进程: 创建和销毁进程的开销相对较大。每个进程都有自己的独立内存空间,需要为其分配和释放资源。
- 线程: 创建和销毁线程的开销较小,因为它们共享进程的资源。线程的创建通常比进程快速,因为不需要分配和初始化新的内存空间。
-
并发性:
- 进程: 进程是独立执行的,相互之间不受影响。进程间通信需要一些额外的机制,如消息传递或共享内存。
- 线程: 线程共享相同的内存空间,因此更容易进行通信。但同时,也需要更加小心处理共享资源,以避免竞争条件和死锁等问题。
-
稳定性:
- 进程: 进程之间的隔离性较高,一个进程的崩溃通常不会影响其他进程。
- 线程: 由于线程共享相同的内存空间,一个线程的错误可能导致整个进程的崩溃。
总的来说,进程和线程是操作系统中用于实现并发的两种基本机制,每种都有其适用的场景和优劣势。选择使用进程还是线程取决于具体的应用需求和设计考虑。
03-006:file-aio
不需要手动设置,Nginx会自动决定要不要启用。
file-aio
是 Nginx 的一个配置选项,用于启用文件异步 I/O(AIO)支持。AIO 允许 Nginx 在处理文件操作时不阻塞进程,提高对文件的读写性能。
具体来说,file-aio
选项的作用如下:
-
启用文件异步 I/O: 通过指定这个选项,你告诉 Nginx 在编译时启用对文件异步 I/O 的支持。
-
提高性能: 文件异步 I/O 允许 Nginx 在进行文件读写操作时,将这些操作交给操作系统异步处理,而不必等待这些操作完成。这有助于提高服务器在处理文件时的性能,特别是在高并发、大文件或高负载的情况下。
使用这个选项的具体命令如下:
./configure file-aio
需要注意的是,文件异步 I/O 的可用性取决于操作系统的支持。不是所有的操作系统都支持 AIO,而且支持程度可能有所不同。在使用 file-aio
选项之前,建议查看 Nginx 的官方文档和相关操作系统的文档,确保 AIO 在你的环境中是可用和适用的。
在 Nginx 1.18.0 版本中,默认情况下是启用文件异步 I/O(file AIO)支持的。这表示在编译 Nginx 1.18.0 时,默认会启用对文件异步 I/O 的支持,无需额外的 file-aio
配置选项。
在 Nginx 1.18.0 版本中,文件异步 I/O 支持是根据操作系统的能力进行检测和启用的。如果你的操作系统支持文件异步 I/O,并且 Nginx 能够检测到该支持,那么文件异步 I/O 将默认启用。
03-007:http_ssl_module
需要手动启用,默认是没有包含的。
这个没什么好说的,就是说默认是启用了SSL证书模块的。注意,这个模块需要系统中有OpenSSL库,大部分Centos服务器都是默认安装了OpenSSL的,比如下面这次编译配置信息就显示使用了系统中的OpenSSL库。
03-008:http_v2_module
需要手动启用,默认是没有包含的。
http_v2_module
是 Nginx 的一个配置选项,用于启用 HTTP/2 协议支持。HTTP/2 是 HTTP 协议的下一代版本,它在性能和效率方面带来了一些改进,例如多路复用、头部压缩等。
具体来说,http_v2_module
选项的作用如下:
-
启用 HTTP/2 支持: 通过指定这个选项,你告诉 Nginx 在编译时启用对 HTTP/2 协议的支持。
-
性能提升: HTTP/2 引入了多路复用,允许多个请求和响应同时在单个连接上进行传输。这可以提高页面加载性能,尤其是在高延迟或不稳定网络环境下。
-
头部压缩: HTTP/2 支持头部字段的压缩,减小了请求和响应的大小,进而降低了网络传输的成本。
使用这个选项的具体命令如下:
./configure http_v2_module
需要注意的是,虽然 HTTP/2 提供了许多性能优势,但在一些特定的场景和配置中,你可能需要注意一些细节。例如,HTTP/2 通常需要使用 HTTPS 进行加密传输,因此你可能还需要配置 SSL 相关的选项。
总体而言,启用 HTTP/2 是一个提高 Web 服务器性能的好方法,特别是在现代浏览器和网络环境下。
03-009:http_realip_module
需要手动启用,默认是没有包含的。
http_realip_module
是 Nginx 的一个配置选项,用于启用 Real IP 模块。Real IP 模块允许 Nginx 从请求的头部中提取客户端的真实 IP 地址,而不是从代理服务器的 IP 地址中获取。
具体来说,http_realip_module
选项的作用如下:
-
提取真实 IP 地址: 当 Nginx 位于代理服务器后面时,通常会从代理服务器的 IP 地址中获取客户端的 IP 地址。启用 Real IP 模块后,Nginx 将能够从请求头中提取出真实的客户端 IP 地址。
-
信任代理服务器的设置: Real IP 模块允许你配置信任的代理服务器的 IP 地址。只有来自这些代理服务器的请求头会被认为是可信的,从而提取真实 IP。
使用这个选项的具体命令如下:
./configure http_realip_module
在配置文件中,你还需要配置 real_ip_header
和 set_real_ip_from
等指令,以明确告诉 Nginx 从哪个请求头提取真实 IP,并信任哪些代理服务器的 IP 地址。
示例配置:
http {real_ip_header X-Forwarded-For;set_real_ip_from 192.168.1.0/24; # 信任的代理服务器 IP 段# 其他配置...
}
上述配置表示从 X-Forwarded-For
请求头中提取真实 IP 地址,并仅信任 192.168.1.0/24
IP 段的代理服务器。
Real IP 模块在处理代理服务器转发时非常有用,特别是在反向代理和负载均衡等场景中。
显然,当Nginx就是一级代理时,这个模块的功能是用不住的。
03-010:http_addition_module
因为不需要,所以不需要手动去指定不启用它。
http_addition_module
是 Nginx 的一个配置选项,用于启用 HTTP Addition 模块。该模块允许在响应的 body 中添加内容,通常用于在服务器返回的内容后追加一些数据。
具体来说,http_addition_module
选项的作用如下:
-
动态添加内容: HTTP Addition 模块允许在 Nginx 生成的响应内容的末尾追加一些额外的内容。这些内容可以是静态的,也可以通过 Nginx 变量来动态生成。
-
响应处理: 通常在一些场景下,你可能希望在服务器生成响应后,再向响应中添加一些额外的信息,例如在返回的 HTML 页面底部添加版权信息或其他注释。
使用这个选项的具体命令如下:
./configure http_addition_module
在配置文件中,你可以使用 add_after_body
指令来指定要添加的内容。例如:
location / {add_after_body "<p>Additional content</p>";# 其他配置...
}
上述配置表示在响应 body 的末尾添加 <p>Additional content</p>
。
HTTP Addition 模块提供了一种简便的方式来在 Nginx 生成的响应中动态添加额外的内容,满足一些定制化的需求。
感受:感觉用处不大,通常响应的内容还是放在HTML模板中生成的。
03-011:http_xslt_module
因为不需要,所以不需要手动去指定不启用它。
http_xslt_module
是 Nginx 的一个配置选项,用于启用 XSLT 模块。XSLT(Extensible Stylesheet Language Transformations)是一种用于将 XML 文档转换为其他格式的语言,通常用于将 XML 格式的响应内容转换为 HTML 或其他格式。
具体来说,http_xslt_module
选项的作用如下:
-
XML 转换: XSLT 模块允许 Nginx 通过提供 XSL 样式表,将 XML 格式的响应内容转换为其他格式,通常是 HTML。
-
动态内容处理: 通过 XSLT,你可以在 Nginx 中动态地处理 XML 内容。这在一些场景下可能很有用,特别是当服务器生成的响应内容以 XML 格式存在时。
使用这个选项的具体命令如下:
./configure http_xslt_module
在配置文件中,你可以使用 xslt_stylesheet
指令来指定 XSL 样式表的路径。例如:
location / {xslt_stylesheet /path/to/style.xsl;# 其他配置...
}
上述配置表示将请求的 XML 响应内容使用 /path/to/style.xsl
中定义的 XSL 样式表进行转换。
需要注意的是,使用 XSLT 需要谨慎,因为它可能会对性能产生影响,特别是在大型 XML 文档上。通常情况下,更现代的前端技术如 JavaScript 和浏览器端的 XSLT 处理可能更为常见。
03-012:http_xslt_module=dynamic
因为不需要,所以不需要手动去指定不启用它。
http_xslt_module=dynamic
是 Nginx 的一个配置选项,用于启用 XSLT 模块并以动态模块的形式加载。这意味着 XSLT 模块将作为一个动态模块在运行时加载,而不是编译 Nginx 时静态地包含在二进制文件中。
具体来说,http_xslt_module=dynamic
选项的作用如下:
-
动态加载 XSLT 模块: 使用这个选项,你告诉 Nginx 在运行时动态加载 XSLT 模块,而不是在编译时将模块静态地链接到 Nginx 二进制文件中。
-
灵活性: 动态加载允许你在不重新编译 Nginx 的情况下添加或删除 XSLT 模块,从而提供更大的灵活性。你可以在需要时加载或卸载模块,而不必重新编译整个 Nginx。
使用这个选项的具体命令如下:
./configure http_xslt_module=dynamic
在配置文件中,你仍然可以使用 xslt_stylesheet
指令来指定 XSL 样式表的路径,但需要注意 XSLT 模块是否已经被正确加载。
location / {xslt_stylesheet /path/to/style.xsl;# 其他配置...
}
需要确保在运行时 XSLT 模块是可用的,并且相关的 XSL 样式表是正确配置的。如果 XSLT 模块未被加载,你可能需要检查 Nginx 的错误日志以获取有关加载问题的信息。
03-013:http_image_filter_module
—Nginx的图像处理
因为不需要,所以不需要手动去指定不启用它。
http_image_filter_module
是 Nginx 的一个配置选项,用于启用 Image Filter 模块。该模块允许 Nginx 在运行时对图像进行一些基本的处理,例如裁剪、旋转、缩放等操作。
具体来说,http_image_filter_module
选项的作用如下:
-
图像处理: Image Filter 模块允许在 Nginx 作为图像服务器时对图像进行实时处理。可以通过配置来执行一系列的图像操作,以满足特定需求。
-
基本操作: Image Filter 提供一些基本的图像处理指令,如缩放、旋转、裁剪等。这些操作可以通过 HTTP 请求中的参数进行指定。
使用这个选项的具体命令如下:
./configure http_image_filter_module
在配置文件中,你可以使用 image_filter
指令来配置 Image Filter 模块。例如:
location /images/ {# 将请求的图像按照指定的参数进行处理image_filter resize 300 200;# 其他配置...
}
上述配置表示对 /images/
路径下的图像进行缩放,使其宽度为 300 像素,高度为 200 像素。
Image Filter 模块为图像处理提供了一些基本的功能,但请注意,它并不是一个完整的图像处理工具,而是提供了一些基本的功能。如果需要更高级的图像处理功能,可能需要使用专门的图像处理工具或库。
03-014:http_image_filter_module=dynamic
因为不需要,所以不需要手动去指定不启用它。
动态加载Image Filter 模块
03-015:http_geoip_module
因为不需要,所以不需要手动去指定不启用它。
我实际看了下,默认情况下也是不包含这个模块的。
这里要特别注意与模块http_geo_module
的区别,关于模块http_geo_module
的详细介绍,请参看这篇博文的 03-036 点。
http_geoip_module
是 Nginx 的一个配置选项,用于启用 GeoIP 模块。GeoIP 模块允许 Nginx 根据客户端的 IP 地址获取地理位置信息,例如国家、地区、城市等,以便根据这些信息进行定制化的处理。
GeoIP 模块允许 Nginx 使用 MaxMind 的 GeoIP 数据库或其他支持的数据源,根据客户端的 IP 地址获取地理位置信息。
但是遗憾的是, GeoIP 数据库已经升级到GeoIP2了,所以这个模块没作用了。
GeoIP2的使用请参考我的另一篇博文:https://blog.csdn.net/wenhao_ir/article/details/134927487【注:仅限昊虹君自己可见,因为里面涉及到了服务器、帐号等信息】
03-016:http_sub_module
—替换响应内容
因为不需要,所以不需要手动去指定不启用它。
http_sub_module
是 Nginx 的一个配置选项,用于启用 Substitution 模块。该模块允许 Nginx 在响应内容中执行字符串替换,通常用于在返回给客户端前修改响应体的内容。
具体来说,http_sub_module
选项的作用如下:
-
字符串替换: Substitution 模块允许在响应内容中执行字符串替换。你可以指定一个字符串模式,并指定用于替换的新字符串。
-
内容修改: 使用这个模块,你可以在 Nginx 中对响应体进行修改,例如替换文本、添加额外的内容等。
使用这个选项的具体命令如下:
./configure http_sub_module
在配置文件中,你可以使用 sub_filter
指令配置 Substitution 模块。例如:
location / {# 对响应体中的所有 "foo" 替换为 "bar"sub_filter "foo" "bar";# 设置替换规则sub_filter_once off;# 其他配置...
}
上述配置表示对所有响应体中的 “foo” 进行替换,将其替换为 “bar”。sub_filter_once off;
配置表示允许多次替换,而不仅仅替换一次。
Substitution 模块通常用于反向代理服务器上,以修改从后端服务器返回的响应内容,但在其他场景中也可能有用途。请注意,使用字符串替换功能时,需要小心确保替换的模式和目标字符串不会影响到响应内容的正确性。
03-017:http_dav_modul
因为不需要,所以不需要手动去指定不启用它。
http_dav_module
是 Nginx 的一个配置选项,用于启用 WebDAV(Web Distributed Authoring and Versioning)模块。WebDAV 是一种基于 HTTP 协议的扩展,用于支持文件的协同编辑和版本控制。
具体来说,http_dav_module
选项的作用如下:
-
WebDAV 支持: 启用 WebDAV 模块后,Nginx 将能够处理 WebDAV 请求,包括对文件和目录的创建、删除、修改等操作。
-
文件管理: WebDAV 提供了一种远程文件管理的方式,允许用户通过 HTTP 协议对远程服务器上的文件进行操作。这对于实现基于 Web 的文件管理系统和协同编辑系统非常有用。
使用这个选项的具体命令如下:
./configure http_dav_module
在配置文件中,你可以使用 dav_methods
指令配置允许的 WebDAV 方法,以及使用 create_full_put_path
指令配置是否自动创建 PUT 请求中指定的路径。
location /webdav/ {dav_methods PUT DELETE MKCOL COPY MOVE;create_full_put_path on;# 其他配置...
}
上述配置表示在 /webdav/
路径下启用 WebDAV,允许 PUT、DELETE、MKCOL、COPY 和 MOVE 等操作,并在执行 PUT 操作时自动创建指定的路径。
WebDAV 模块为使用基于 Web 的文件管理和协同编辑的应用提供了一个基础设施。请注意,使用 WebDAV 时,你可能需要考虑安全性和访问权限的问题,以确保适当的文件管理和保护。
03-018:http_flv_module
有可能需要,而默认是没有包含的,所以手动指定一下。
http_flv_module
是 Nginx 的一个配置选项,用于启用 FLV(Flash Video)模块。该模块允许 Nginx 在处理 FLV 文件时提供基本的流媒体支持,以便在支持 Flash 播放器的环境中播放 FLV 视频。
具体来说,http_flv_module
选项的作用如下:
-
FLV 支持: 启用 FLV 模块后,Nginx 将能够直接处理 FLV 文件,而不仅仅是将其作为静态文件传递给客户端。
-
流媒体播放: FLV 模块提供了一些功能,使得 Nginx 能够在流媒体的环境中提供 FLV 视频的播放支持。这对于在 Web 页面上使用 Flash 播放器播放 FLV 文件很有用。
使用这个选项的具体命令如下:
./configure http_flv_module
在配置文件中,你可以使用 location
指令来配置 FLV 模块的行为。例如:
location /videos/ {flv;# 其他配置...
}
上述配置表示在 /videos/
路径下启用 FLV 模块。
请注意,由于 Flash 播放器的使用逐渐减少,而 HTML5 提供了更先进的视频播放支持,因此在现代环境中使用 FLV 模块可能会有一些限制。如果你需要支持更广泛的视频格式和播放方式,可能需要考虑使用 HTML5 视频标签等现代技术。
03-019:http_mp4_module
因为需要,而默认是没有包含的,需要手动启用。
http_mp4_module
是 Nginx 的一个配置选项,用于启用 MP4 模块。该模块允许 Nginx 直接处理 MP4 文件,支持基本的流媒体功能,以便在浏览器中播放 MP4 视频。
具体来说,http_mp4_module
选项的作用如下:
-
MP4 支持: 启用 MP4 模块后,Nginx 将能够直接处理 MP4 文件,而不仅仅是将其作为静态文件传递给客户端。
-
流媒体播放: MP4 模块提供了一些功能,使得 Nginx 能够在流媒体的环境中提供 MP4 视频的播放支持。这对于在 Web 页面上使用 HTML5 播放器等方式播放 MP4 文件很有用。
使用这个选项的具体命令如下:
./configure http_mp4_module
在配置文件中,你可以使用 location
指令来配置 MP4 模块的行为。例如:
location /videos/ {mp4;# 其他配置...
}
上述配置表示在 /videos/
路径下启用 MP4 模块。
03-020:http_gunzip_module
因为需要,而默认是没有包含的,需要手动启用。
http_gunzip_module
是 Nginx 的一个配置选项,用于启用 Gzip 模块中的解压缩功能。该模块允许 Nginx 在接收到客户端的请求时,解压缩包含 Gzip 压缩内容的请求,以便对其进行处理。
具体来说,http_gunzip_module
选项的作用如下:
-
支持客户端请求解压缩: 启用 Gzip 模块中的解压缩功能后,Nginx 可以处理包含 Gzip 压缩内容的客户端请求,自动解压缩请求体,使得服务器可以正常处理解压后的数据。
-
提高性能: 在某些情况下,客户端可能使用 Gzip 压缩请求体以减小传输的数据量。启用解压缩功能后,Nginx 可以在处理这样的请求时提高性能。
使用这个选项的具体命令如下:
./configure http_gunzip_module
在配置文件中,你通常不需要额外的配置来启用解压缩功能。一旦启用了 http_gunzip_module
,Nginx 将自动尝试解压缩包含 Gzip 压缩内容的客户端请求。
server {listen 80;server_name example.com;location / {# 其他配置...}
}
上述配置中,location /
的其他配置将自动处理包含 Gzip 压缩内容的客户端请求。
请注意,虽然解压缩功能可以提高性能,但也需要注意潜在的安全风险,因此在使用时应仔细评估。
03-021:http_gzip_static_module
因为需要,而默认是没有包含的,需要手动启用。
http_gzip_static_module
是 Nginx 的一个配置选项,用于启用 Gzip 模块中的静态文件压缩功能。该模块允许 Nginx 在服务端对静态文件进行 Gzip 压缩,以减小文件传输大小,提高页面加载性能。
具体来说,http_gzip_static_module
选项的作用如下:
-
静态文件压缩: 启用 Gzip 模块中的静态文件压缩功能后,Nginx 可以在传输静态文件(如 CSS、JavaScript、HTML 等)时,将这些文件在服务端进行 Gzip 压缩,然后再传输给客户端。
-
减小传输大小: Gzip 压缩可以显著减小文件的传输大小,提高页面加载速度,尤其是在网络带宽有限的情况下。
使用这个选项的具体命令如下:
./configure http_gzip_static_module
在配置文件中,你可以使用 gzip_static
指令来启用静态文件的 Gzip 压缩。例如:
http {gzip_static on;server {listen 80;server_name example.com;location /static/ {# 针对 /static/ 路径下的静态文件启用 Gzip 压缩gzip_static on;# 其他配置...}# 其他 server 配置...}
}
上述配置中,gzip_static on;
启用了静态文件的 Gzip 压缩,而 location /static/
下的文件将会根据配置进行 Gzip 压缩后传输给客户端。
使用静态文件 Gzip 压缩可以显著提高页面加载性能,但需要确保在服务端存储了经过压缩的静态文件,以避免实时压缩的性能开销。
感受:这就是为什么我们在浏览器端看到的静态文件的大小比静态文件的实际大小要小的原因,这是因为在传输过程中启用了gzip压缩功能。
03-022:http_auth_request_module
—身份验证功能模块
因为不需要,所以不需要手动去指定不启用它。
http_auth_request_module
是 Nginx 的一个配置选项,用于启用 Auth Request 模块。该模块允许 Nginx 在进行访问控制时,将身份验证请求委托给其他服务或程序,从而实现更灵活的身份验证机制。
具体来说,http_auth_request_module
选项的作用如下:
-
动态身份验证: Auth Request 模块允许 Nginx 将身份验证请求发送到其他服务或程序,该服务或程序负责对用户进行身份验证。这使得你可以使用自定义的身份验证逻辑,而不仅仅依赖于 Nginx 内置的基本身份验证或其他身份验证模块。
-
灵活性: 通过委托身份验证请求,你可以使用各种外部身份验证服务,例如 OAuth 认证、LDAP、HTTP 请求等。这提供了更大的灵活性,以适应不同的身份验证需求。
使用这个选项的具体命令如下:
./configure http_auth_request_module
在配置文件中,你可以使用 location
指令来配置 Auth Request 模块。例如:
location /protected/ {# 发送身份验证请求到 /auth/check,由该服务进行身份验证auth_request /auth/check;# 如果身份验证成功,允许访问auth_request_set $auth_status $upstream_status;if ($auth_status = 200) {# 允许访问proxy_pass http://backend;}# 如果身份验证失败,返回 403 Forbiddendeny all;
}location = /auth/check {# 身份验证服务的配置,例如向其他服务发起身份验证请求# ...# 返回身份验证结果,200 表示验证成功,其他代码表示验证失败return 200;
}
上述配置中,location /protected/
下的访问会触发 Auth Request 模块,将身份验证请求发送到 /auth/check
路径。如果身份验证成功(return 200;
),则允许访问,否则返回 403 Forbidden。/auth/check
路径对应的配置是一个示例,你需要根据实际情况配置一个具体的身份验证服务。
03-023:http_random_index_module
因为不需要,所以不需要手动去指定不启用它。
http_random_index_module
是 Nginx 的一个配置选项,用于启用 Random Index 模块。该模块允许 Nginx 在访问目录时,随机选择一个文件作为索引文件,而不是使用传统的索引文件(如 index.html)。
具体来说,http_random_index_module
选项的作用如下:
-
随机索引文件: 启用 Random Index 模块后,当客户端请求访问一个目录而没有指定明确的索引文件时,Nginx 将从该目录中随机选择一个文件作为索引文件返回给客户端。
-
灵活性: 这提供了一种更具灵活性的方式来呈现目录内容,而不是使用固定的索引文件。这在一些场景下可能有用,例如展示目录中的随机图片、文件等。
使用这个选项的具体命令如下:
./configure http_random_index_module
在配置文件中,你可以使用 random_index
指令来启用 Random Index 模块,并指定需要处理的文件类型。例如:
location /images/ {# 在 /images/ 路径下启用 Random Index 模块random_index on;# 其他配置...
}
上述配置表示在 /images/
路径下启用 Random Index 模块,Nginx 将在该目录中随机选择一个文件作为索引文件返回给客户端。
请注意,使用随机索引文件可能不适用于所有场景,特别是在需要控制展示顺序的情况下。在一些应用场景中,更常见的是使用固定的索引文件,如 index.html
。
03-024:http_secure_link_module
因为不需要,所以不需要手动去指定不启用它。
http_secure_link_module
是 Nginx 的一个配置选项,用于启用 Secure Link 模块。Secure Link 模块提供了一种基于 URL 的安全性机制,用于保护资源免受未经授权的访问。
具体来说,http_secure_link_module
选项的作用如下:
-
URL 安全性: Secure Link 模块用于创建包含签名的 URL,以确保只有具有有效签名的请求才能访问资源。这可以防止未经授权的访问和链接的滥用。
-
资源保护: 通过使用安全链接,你可以确保只有知道签名算法和密钥的客户端能够生成有效的链接,从而保护敏感资源不被未经授权的访问。
使用这个选项的具体命令如下:
./configure http_secure_link_module
在配置文件中,你可以使用 secure_link
指令来配置 Secure Link 模块的行为。例如:
location /secure/ {# 启用 Secure Link 模块secure_link $arg_md5,$arg_expires;# 配置密钥和有效期secure_link_md5 "secretkey$uri$arg_expires";secure_link_expires +1m;# 其他配置...
}
上述配置中,secure_link
启用了 Secure Link 模块,并配置了签名参数($arg_md5
和 $arg_expires
)。secure_link_md5
指令配置了签名算法,使用了密钥和 URI。secure_link_expires
指令配置了链接的有效期。
客户端在访问 /secure/
路径时,需要提供有效的签名和时间戳参数,否则将无法访问资源。
请注意,Secure Link 模块提供了一种基本的安全性机制,但在一些高级安全需求的场景中,可能需要考虑其他更复杂的安全机制和认证方式。
03-025:http_degradation_module
—防止Nginx对服务器的内存过度使用
http_degradation_module
模块用于限制Nginx对服务器的内存过度使用,当Nginx对服务器的内存使用超过某个数值时,对多余的请求作限制处理,比如返回204或404等页面。
这个模块的源代码链接:
https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/http/modules/ngx_http_degradation_module.c
使用方法如下:
①在http模块中写入下面的代码:
# 限制内存最大使用为500Mdegradation sbrk=500m;
sbrk
: 表示“set break”,它是指用于管理进程地址空间的系统调用,通常用于内存管理。在这个上下文中,它表示当Nginx对内存的使用超过500M时,限制Nginx继续占用更多内存。
500m
: 这是一个参数,表示Nginx允许的最大内存大小。在这里,500m
意味着设置了 500 兆字节的内存限制。
②在server模块中写入下面的代码:
location / {# 当系统资源使用达到90%时启用Degradation 模块,防止服务器过载degrade 204;}
上面的代码表示当Nginx使用内存超过500M时,返回204页面。
03-026:http_slice_module
因为不需要,所以不需要手动去指定不启用它。
http_slice_module
是 Nginx 的一个配置选项,用于启用 Slice 模块。Slice 模块允许将客户端的请求切分成多个片段(slices),并允许服务器在不同的时间或并行处理这些片段,从而提高请求的并发处理能力。
具体来说,http_slice_module
选项的作用如下:
-
请求切分: Slice 模块允许将客户端的大型请求切分成多个片段。这对于处理大文件上传或大型数据流的情况下很有用。
-
并发处理: 切分的请求片段可以在服务器上并发处理,从而提高请求的处理能力。每个片段可以独立地处理,不必等待整个请求的传输完成。
使用这个选项的具体命令如下:
./configure http_slice_module
在配置文件中,你可以使用 slice
指令来配置 Slice 模块的行为。例如:
location /upload {# 启用 Slice 模块slice;# 设置切片大小slice_size 1m;# 其他配置...
}
上述配置中,slice;
启用了 Slice 模块,并通过 slice_size
设置了切片的大小为 1 MB。客户端可以将大文件分成 1 MB 的小块进行上传,而服务器可以并发地处理这些小块。
Slice 模块通常用于处理大文件上传或大数据流的情况。请注意,使用 Slice 模块时,客户端需要支持并发送 Range
头部,以指定请求的切片范围。
03-027:http_stub_status_module
-Nginx运行状态监控页面
有可能需要,而默认是没有包含的,所以手动指定一下。
http_stub_status_module
是 Nginx 的一个配置选项,用于启用 Stub Status 模块。Stub Status 模块提供了一个简单的页面,用于监控 Nginx 服务器的基本性能指标和运行状态。
具体来说,http_stub_status_module
选项的作用如下:
-
性能监控: Stub Status 模块允许通过 HTTP 请求获取 Nginx 服务器的性能指标,如连接数、请求处理情况、各种状态码的请求数等。
-
状态信息: 访问 Stub Status 页面可以获取关于 Nginx 工作进程的状态信息,以便进行性能调优和监控。
使用这个选项的具体命令如下:
./configure http_stub_status_module
在配置文件中,你可以使用 location
指令来配置 Stub Status 模块的页面访问路径。例如:
server {listen 80;server_name example.com;location /nginx_status {# 启用 Stub Status 模块stub_status;# 允许指定 IP 地址访问 Stub Status 页面allow 127.0.0.1;deny all;# 其他配置...}# 其他 server 配置...
}
上述配置中,location /nginx_status
启用了 Stub Status 模块,并配置了允许访问该页面的 IP 地址。你可以通过访问 http://example.com/nginx_status
获取 Nginx 的基本性能信息。
Stub Status 页面的示例输出可能包括以下信息:
Active connections: 10
server accepts handled requests10 10 10
Reading: 0 Writing: 1 Waiting: 9
这些信息提供了当前连接数、请求处理情况以及读取、写入和等待状态的信息。你可以通过监控这些指标来了解服务器的负载情况和性能状况。请注意,在生产环境中,应该谨慎配置 Stub Status 页面的访问权限,以防止信息泄露。
03-028:http_charset_module
因为不需要,所以不需要手动去指定不启用它。
http_charset_module
是 Nginx 的一个模块,用于处理字符集(Charset)的相关设置。具体来说,http_charset_module
主要用于配置服务器响应中的字符集信息,以确保客户端正确解析和显示文本内容。
以下是 http_charset_module
的主要作用:
-
字符集配置: 允许配置服务器响应的字符集,确保文本内容按照正确的字符集传递给客户端。
-
自动检测字符集: 可以启用字符集自动检测,以便服务器自动检测文本文件的字符集并在响应中指定。这对于处理多语言网站或接收多种字符集的文本文件很有用。
使用 http_charset_module
的配置示例如下:
http {charset utf-8; # 设置默认字符集为 UTF-8server {listen 80;server_name example.com;location / {# 允许自动检测字符集charset_types text/plain text/html;# 其他配置...}}
}
在上述示例中:
charset utf-8;
配置了默认字符集为 UTF-8。charset_types text/plain text/html;
允许自动检测字符集的文件类型包括 plain text (text/plain
) 和 HTML (text/html
)。
这样配置后,Nginx 将在响应中添加 Content-Type
头部,指定相应的字符集信息,以确保客户端正确地解析和显示文本内容。字符集设置对于确保网站在不同语言环境中正确显示文本内容非常重要。
03-029:http_gzip_module
这个模块很特殊,因为我在默认编译出的目标文件中,我发现了下面这个模块:
objs/src/http/modules/ngx_http_gzip_filter_module.o
问了下,ngx_http_gzip_filter_module实际上就是http_gzip_module,造成这个问题的原因应该是nginx的configure文件中的名字是可以和目标文件的名字不一样的。
所以这里不需要显示再去包含这个模块。
http_gzip_module
是 Nginx 的一个模块,用于实现对 HTTP 响应的内容进行 Gzip 压缩。Gzip 压缩是一种用于减小文件大小、提高传输速度的技术,特别适用于文本内容,如 HTML、CSS、JavaScript 等。
以下是 http_gzip_module
的主要作用:
-
内容压缩: 通过 Gzip 压缩,可以显著减小传输的文件大小,从而降低网络传输的时间和带宽消耗。
-
网络性能: 压缩文件后,客户端需要更少的时间来下载资源,从而提高页面加载速度,减少用户等待时间,改善用户体验。
使用 http_gzip_module
的配置示例如下:
http {gzip on; # 启用 Gzip 压缩gzip_types text/plain text/css application/json application/javascript application/xml; # 指定需要压缩的文件类型server {listen 80;server_name example.com;location / {# 其他配置...}}
}
在上述示例中:
gzip on;
启用了 Gzip 压缩。gzip_types
指定了需要进行 Gzip 压缩的文件类型,包括了 text/plain、text/css、application/json 等。
这样配置后,Nginx 会检查每个响应的 Content-Type,并对配置的文件类型进行 Gzip 压缩。当客户端支持 Gzip 压缩时,服务器会将压缩后的内容传输给客户端。
注意:虽然 Gzip 压缩提高了性能,但也需要在服务器和客户端之间进行压缩和解压缩的操作,这可能会导致一些额外的 CPU 开销。因此,需要权衡压缩带来的性能提升和服务器资源的消耗。
注意:模块 http_gzip_static_module 只是对静态文件启用gzip压缩功能。
03-030:http_ssi_module
因为不需要,所以不需要手动去指定不启用它。
http_ssi_module
是 Nginx 的一个模块,用于处理服务器端包含(SSI)的功能。SSI 允许在 HTML 页面中嵌入动态内容,使得可以通过服务器端生成的数据来更新页面。
以下是 http_ssi_module
的主要作用:
-
动态内容嵌入: SSI 允许在 HTML 页面中插入动态生成的内容,从而实现页面的动态更新。
-
模板引擎: 可以将 SSI 视为一种简单的模板引擎,通过在 HTML 页面中插入一些特殊的指令,将动态数据嵌入到静态页面中。
-
模块指令: 提供一些指令,例如
<!--#include -->
,用于在 HTML 页面中包含其他文件的内容,或者<!--#echo -->
用于输出变量。
使用 http_ssi_module
的配置示例如下:
http {ssi on; # 启用 SSI 模块server {listen 80;server_name example.com;location / {root /path/to/your/html/files;index index.html;# 允许 SSI 处理 HTML 文件ssi_types text/html;# 其他配置...}}
}
在上述示例中:
ssi on;
启用了 SSI 模块。ssi_types text/html;
指定了对 HTML 文件进行 SSI 处理。
然后,在 HTML 文件中,你可以使用 SSI 指令来插入动态内容。例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>SSI Example</title>
</head>
<body><h1>Hello, <!--#echo var="REMOTE_ADDR" -->!</h1><p>The current time is: <!--#echo var="DATE_LOCAL" --></p>
</body>
</html>
在上述 HTML 文件中,<!--#echo var="REMOTE_ADDR" -->
用于输出客户端的 IP 地址,而 <!--#echo var="DATE_LOCAL" -->
用于输出服务器的本地时间。这些动态内容将在页面加载时由服务器端生成并替换。
03-031:http_userid_module
因为不需要,所以不需要手动去指定不启用它。
http_userid_module
是 Nginx 的一个模块,用于处理用户标识(User ID)的相关功能。主要作用是为请求添加或修改用户标识,并可以通过配置进行定制。
以下是 http_userid_module
的主要作用:
-
用户标识: 允许为用户请求添加或修改一个用户标识,通常用于跟踪用户的访问和行为。
-
Cookie 设置: 可以通过设置 Cookie 来存储用户标识,使得用户在后续请求中可以携带该标识。
-
配置灵活: 提供了一系列配置项,可以根据需要定制用户标识的生成规则、过期时间等。
使用 http_userid_module
的配置示例如下:
http {userid on; # 启用 User ID 模块server {listen 80;server_name example.com;location / {# 允许 User ID 处理userid_mode transparent;# 设置 Cookie 名称和过期时间userid_name my_user_id;userid_expires 30d;# 其他配置...}}
}
在上述示例中:
userid on;
启用了 User ID 模块。userid_mode transparent;
设置 User ID 模块的处理模式为透明模式,即将用户标识添加到请求中。userid_name my_user_id;
设置了 Cookie 的名称为my_user_id
。userid_expires 30d;
设置了 Cookie 的过期时间为 30 天。
这样配置后,当用户访问该服务器时,Nginx 将为其生成一个用户标识,并通过设置 Cookie 的方式存储在客户端。在后续请求中,客户端会携带这个 Cookie,服务器就可以根据这个用户标识来识别用户。
请注意,用户标识的使用需要遵守隐私政策和相关法规,确保用户隐私得到保护。
那不启用http_userid_module模块,用Django能处理cookie不?
是的,即使没有启用 Nginx 的 http_userid_module
模块,Django 本身也能够处理 Cookie。Django 框架内置了处理用户会话和 Cookie 的功能,无需依赖于 Nginx 的模块。
在 Django 中,你可以使用 Django 的 request
对象来读取和设置 Cookie。以下是一个简单的示例:
from django.http import HttpResponsedef set_cookie(request):# 设置 Cookieresponse = HttpResponse("Cookie set!")response.set_cookie('my_cookie', 'cookie_value', max_age=3600) # 设置过期时间为 1 小时return responsedef get_cookie(request):# 读取 Cookiemy_cookie_value = request.COOKIES.get('my_cookie', 'default_value')return HttpResponse(f"Value of my_cookie: {my_cookie_value}")
在上述示例中:
set_cookie
视图设置了一个名为my_cookie
的 Cookie,其值为'cookie_value'
,并设置了过期时间为 1 小时。get_cookie
视图读取了名为my_cookie
的 Cookie 的值。
这些视图可以通过 Django 的 URL 映射机制供客户端访问。你可以根据自己的需求进行更复杂的 Cookie 操作,包括设置路径、域、安全标志等。不过,在使用 Cookie 时请注意隐私和安全性,确保符合相关的法规和最佳实践。
03-032:http_access_module
这个模块Nginx是默认包含了的,但是名字实际上是“ngx_http_access_module.o”
设置IP白名单和黑名单就需要它。
03-033:http_auth_basic_modul
—对受保护的资源加上用户名和密码
因为不需要,所以不需要手动去指定不启用它。
http_auth_basic_module
是 Nginx 的一个模块,用于启用 HTTP 基本认证(HTTP Basic Authentication)。HTTP 基本认证是一种简单的身份验证机制,要求用户在访问受保护的资源时提供用户名和密码。这些信息会以 Base64 编码的形式传输,因此不适用于在非安全连接上传输密码。
以下是 http_auth_basic_module
的主要作用:
-
身份验证: 启用 HTTP 基本认证,要求用户提供有效的用户名和密码来访问受保护的资源。
-
简单配置: 提供了简单的配置选项,可以指定认证领域的名称(Realm)和用户密码文件的位置。
使用 http_auth_basic_module
的配置示例如下:
server {listen 80;server_name example.com;location / {auth_basic "Restricted Access"; # 设置认证领域的名称auth_basic_user_file /etc/nginx/.htpasswd; # 指定用户密码文件的位置# 其他配置...}
}
在上述示例中:
-
auth_basic "Restricted Access";
设置了认证领域的名称为 “Restricted Access”,这是用户在弹出的认证提示框中看到的文本。 -
auth_basic_user_file /etc/nginx/.htpasswd;
指定了包含用户名和密码的密码文件的位置。密码文件的格式是username:encrypted_password
。可以使用htpasswd
命令生成这样的文件,确保密码的安全性。
在实际应用中,建议使用 HTTPS 来加密传输用户名和密码,以增加安全性。此外,要定期更新密码文件以及使用强密码策略来确保用户密码的安全性。
03-034:http_mirror_module
—将客户端请求同时转发到镜像服务器,以进行开发测试
因为不需要,所以不需要手动去指定不启用它。
http_mirror_module
是 Nginx 的一个模块,用于设置镜像服务器,将客户端请求的数据镜像到指定的服务器。这个模块通常用于在生产环境中创建镜像副本,以便进行测试、监控或其他目的。
以下是 http_mirror_module
的主要作用:
-
请求镜像: 将客户端的请求数据镜像到一个或多个指定的服务器,使得这些服务器能够接收到相同的请求。
-
用途多样: 可以用于监控、测试和负载平衡的场景,以便在不影响生产环境的情况下观察请求的行为。
使用 http_mirror_module
的配置示例如下:
location / {mirror /mirror;# 其他配置...
}location /mirror {internal;proxy_pass http://mirror_backend;# 其他配置...
}
在上述示例中:
-
location /
中使用了mirror
指令,将客户端请求的数据镜像到/mirror
路径。 -
location /mirror
中通过proxy_pass
将镜像的请求转发到mirror_backend
,这个是镜像服务器的地址。
这样配置后,当客户端发送请求到主服务器时,请求的数据会被镜像到 /mirror
路径,并通过 proxy_pass
转发到 mirror_backend
服务器。
请注意,/mirror
路径通常使用 internal
关键字标记,以确保只有主服务器可以内部转发请求到这个路径。这有助于确保镜像请求不会被外部客户端直接访问。
03-035:http_autoindex_module
—自动生成目录下的文件列表
因为不需要,所以不需要手动去指定不启用它。
http_autoindex_module
是 Nginx 的一个模块,用于自动生成目录索引。当访问一个目录而不指定具体的文件时,Nginx 可以使用 http_autoindex_module
自动生成该目录的文件列表,方便用户浏览和访问其中的内容。
以下是 http_autoindex_module
的主要作用:
-
目录索引: 自动生成目录的文件列表,以便用户可以通过浏览器访问目录中的文件。
-
定制化: 提供一系列的配置选项,允许你定制目录索引的显示方式,包括样式、列数、排序方式等。
使用 http_autoindex_module
的配置示例如下:
server {listen 80;server_name example.com;location / {autoindex on; # 启用目录索引# 其他配置...}
}
在上述示例中,autoindex on;
启用了目录索引。如果访问的是一个目录而不是具体的文件,Nginx 将自动生成该目录的文件列表。
你还可以通过 autoindex
指令的其他配置选项来进行定制。例如:
location / {autoindex on; # 启用目录索引autoindex_exact_size off; # 显示文件大小的约数而非精确值autoindex_localtime on; # 使用本地时间而非 UTC 时间autoindex_header 1; # 显示表头信息autoindex_columns 3; # 指定列数autoindex_ignore "*.log"; # 忽略特定文件# 其他配置...
}
这些选项允许你调整目录索引的外观和行为,以满足特定需求。请注意,自动生成的目录索引可能会泄露敏感信息,因此在生产环境中要小心使用。
03-036:http_geo_module
这个也是默认包含的模块,如果包含了它,那么就可以用geo指令了。
值得注意的是:虽然在configure的help命令中它的名字是:http_geo_module,但是实际上它最终编译出来的目标文件的名字为 ngx_http_geo_module.o
,我实测了下,如果要不包含这个模块,需要下面的命令:
--without-http_geo_module
这就充分说明编译出来的目标文件的名字与configure中使用的模块名可以是不一样的。
要注意这个模块与模块http_geoip_module
的区别。关于模块的介绍http_geoip_module
,请参见本篇博 文 03-015 点的介绍。
问:能不能介绍下Nginx的geo指令?
当在Nginx配置文件中使用geo
指令时,可以根据客户端的IP地址或其他变量的值定义一组条件,并在这些条件下执行相应的操作。geo
模块允许你创建一系列变量,这些变量的值基于客户端的IP地址或其他特定的值。
以下是geo
指令的基本语法:
geo $variable {default value;CIDR_range value;CIDR_range value;...
}
$variable
: 定义一个用于存储IP地址或其他值的变量。default value
: 指定当没有匹配条件时的默认值。CIDR_range
: 定义一个CIDR范围,当客户端的IP地址匹配这个范围时,将使用相应的值。
下面是一个简单的例子,演示如何使用geo
指令:
http {geo $my_country {default ZZ; # 默认值为 ZZ192.168.1.0/24 US; # 如果客户端IP在这个范围内,$my_country的值为 US10.0.0.0/8 AU; # 如果客户端IP在这个范围内,$my_country的值为 AU}server {location / {# 使用$my_country变量进行条件判断if ($my_country = US) {return 301 http://www.example-us.com;}if ($my_country = AU) {return 301 http://www.example-au.com;}# 默认情况下,重定向到一个通用站点return 301 http://www.example-global.com;}}
}
在这个例子中,根据客户端的IP地址,$my_country
变量的值将被设置为相应的国家代码。然后,通过if
语句检查这个变量的值,并执行相应的操作。请注意,使用if
语句可能会导致一些不希望出现的问题,因此要小心使用。
geo
指令可用于更复杂的条件判断,例如根据不同的IP范围提供不同的服务或内容。
以下是运用geo
指令进行负载均衡的例子:
Nginx中geo模块与利用其配置负载均衡的方法
03-037:http_map_module
因为不需要,所以不需要手动去指定不启用它。
http_map_module
是 Nginx 的一个模块,用于创建映射关系,将一个值映射到另一个值。它提供了一种简单而强大的机制,可以在配置文件中定义映射规则,然后在 Nginx 的其他地方使用这些映射。
以下是 http_map_module
的主要作用:
-
值映射: 允许将一个值映射到另一个值。这可以用于在请求处理过程中转换、重命名或修改变量的值。
-
条件匹配: 映射可以基于条件匹配,允许根据请求的一些特定属性来选择映射。
使用 http_map_module
的配置示例如下:
http {map $request_method $new_method {default $request_method;GET "mapped_get";POST "mapped_post";PUT "mapped_put";DELETE "mapped_delete";}server {listen 80;server_name example.com;location / {# 使用映射后的值add_header X-Mapped-Method $new_method;# 其他配置...}}
}
在上述示例中:
-
map $request_method $new_method
定义了一个映射,将$request_method
的值映射到$new_method
。 -
add_header X-Mapped-Method $new_method;
在请求处理中使用了映射后的值,将它添加到响应的头部中。
在实际应用中,你可以使用 http_map_module
来根据请求的不同属性动态地选择配置项,或者将一种变量值映射为另一种形式。这提供了一种非常灵活的方式来根据需要自定义请求的处理。
03-038:http_split_clients_module
因为不需要,所以不需要手动去指定不启用它。
http_split_clients_module
是 Nginx 的一个模块,用于在多个后端服务器之间分配客户端请求。它提供了一种根据客户端的一些属性(例如 IP 地址或用户代理字符串)来决定将请求分发到哪个后端服务器的机制。
以下是 http_split_clients_module
的主要作用:
-
A/B 测试: 可以用于实施 A/B 测试,通过将不同的客户端请求分配到不同的后端服务器,以测试不同的功能或页面版本。
-
灰度发布: 用于实现灰度发布,通过将请求分发到不同的后端服务器,逐步将新版本推送给一小部分用户进行测试。
使用 http_split_clients_module
的配置示例如下:
http {split_clients "${remote_addr}AAA" $backend {20% server1;80% server2;* server3;}upstream backend {server server1.example.com;server server2.example.com;server server3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://$backend;# 其他配置...}}
}
在上述示例中:
-
split_clients "${remote_addr}AAA" $backend
定义了一个分流规则,将请求的 20% 分配到server1
,80% 分配到server2
,其余的请求分配到server3
。 -
upstream backend
定义了实际的后端服务器列表。 -
proxy_pass http://$backend;
使用分流后的后端服务器来处理请求。
这样配置后,根据客户端的 IP 地址,请求将被分发到不同的后端服务器。请注意,实际的配置可以根据具体的需求进行调整,例如可以根据其他变量来进行分流。
03-038:http_referer_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
抱歉,Nginx 并没有一个名为 http_referer_module
的独立模块。但是,有一个名为 http_referer
的变量,它用于获取客户端请求中的 Referer 头的值。
Referer
头是 HTTP 请求头的一部分,用于指示请求的来源 URL。http_referer
变量可以在 Nginx 配置中使用,以便根据请求的来源进行一些特定的处理或控制。
以下是一个简单的示例,演示了如何使用 http_referer
变量:
server {listen 80;server_name example.com;location / {if ($http_referer ~* (google|bing|yahoo)) {# 如果 Referer 包含 google、bing 或 yahoo,执行某些操作# 这里可以添加具体的处理逻辑}# 其他配置...}
}
在上述示例中,通过使用 $http_referer
变量,可以检查请求的来源是否包含 “google”、“bing” 或 “yahoo”,从而执行特定的操作。
请注意,使用 if
指令时需要小心,因为它可能引入一些不直观的行为。在 Nginx 中,if
指令并不像在其他编程语言中那样,它是在不同阶段处理请求的,因此在某些情况下可能不如预期工作。如果可能,建议尽量避免使用 if
指令,尤其是在复杂的配置中。
03-039:http_rewrite_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
抱歉,似乎存在一些误导,Nginx 并没有一个名为 without-http_rewrite_module
的模块。相反,rewrite
功能是由 ngx_http_rewrite_module
模块提供的。
ngx_http_rewrite_module
模块是 Nginx 中非常强大且常用的模块之一,它允许对请求 URI 进行修改,实现 URL 重写和重定向。通过使用 rewrite
指令,你可以按照自定义的规则修改请求的 URI。
以下是一个简单的示例,演示了如何使用 rewrite
指令:
server {listen 80;server_name example.com;location /old-uri {rewrite ^/old-uri(.*)$ /new-uri$1 permanent;}# 其他配置...
}
在上述示例中,当请求的 URI 以 /old-uri
开头时,通过 rewrite
指令将其重定向到以 /new-uri
开头的新 URI。permanent
参数表示使用 HTTP 301 永久重定向。
请注意,使用 rewrite
指令时要小心,确保规则正确并且没有导致不必要的性能影响。在复杂的重写规则场景下,可能需要深入了解该模块的使用方式。
03-040:http_proxy_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
http_proxy_module
是 Nginx 的一个核心模块,用于将请求代理转发到其他服务器。它提供了代理服务器的功能,允许 Nginx 作为反向代理或负载均衡器,将请求转发到后端的一个或多个服务器上。
以下是 http_proxy_module
的主要作用:
-
反向代理: 允许 Nginx 接收客户端的请求,并将这些请求代理到后端服务器,然后将响应返回给客户端。这有助于隐藏后端服务器的实际地址和细节,提高安全性和可维护性。
-
负载均衡: 可以配置 Nginx 作为负载均衡器,将请求分发到多个后端服务器,以提高性能和可用性。
-
缓存: 允许设置缓存,将后端服务器的响应缓存起来,从而减轻后端服务器的负载并提高响应速度。
使用 http_proxy_module
的简单配置示例如下:
http {server {listen 80;server_name example.com;location / {proxy_pass http://backend_server;# 其他代理配置...}}upstream backend_server {server backend1.example.com;server backend2.example.com;# 可以添加更多的后端服务器...}
}
在上述示例中:
-
proxy_pass http://backend_server;
指定了代理的后端服务器,将请求转发到backend_server
定义的一组后端服务器。 -
upstream backend_server
定义了一组后端服务器的列表,可以是单个服务器,也可以是多个服务器。Nginx 将根据负载均衡算法分配请求到这些后端服务器。
这是一个基本的反向代理和负载均衡的配置示例,具体的配置可以根据实际需求进行调整,例如添加缓存、设置负载均衡算法、配置请求头等。
03-041:http_fastcgi_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
需要,因为需要与Gunicorn通信。
http_fastcgi_module
是 Nginx 的一个模块,用于与 FastCGI 进程通信,实现通过 FastCGI 协议与后端应用程序进行交互。FastCGI 是一种通信协议,允许 Nginx 作为 Web 服务器与独立的 FastCGI 进程(如 PHP-FPM、uWSGI、Gunicorn 等)进行通信,以处理动态生成的内容。
以下是 http_fastcgi_module
的主要作用:
-
与 FastCGI 进程通信: 允许 Nginx 通过 FastCGI 协议与后端的 FastCGI 进程进行通信,以处理动态内容生成和处理。
-
支持多种编程语言: FastCGI 协议是一种通用的协议,因此
http_fastcgi_module
可以与多种编程语言一起使用,例如 PHP、Python、Ruby 等。 -
性能和灵活性: FastCGI 提供了比传统的 CGI 更好的性能,因为 FastCGI 进程可以保持持久连接,而不需要为每个请求都启动新的进程。这提高了性能并降低了资源消耗。
以下是一个简单的 Nginx 配置示例,使用 http_fastcgi_module
与 PHP-FPM 进程通信:
server {listen 80;server_name example.com;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \.php$ {include fastcgi_params;fastcgi_pass unix:/var/run/php-fpm.sock;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;}# 其他配置...
}
在上述示例中:
location ~ \.php$
定义了处理 PHP 脚本的位置块。fastcgi_pass unix:/var/run/php-fpm.sock;
指定了与 PHP-FPM 进程通信的 FastCGI 服务器地址。fastcgi_param
配置了一些 FastCGI 参数,包括脚本文件名和脚本名称。
这是一个基本的配置示例,具体的配置取决于你的后端 FastCGI 进程的类型和配置。
03-042:http_uwsgi_module
实际上我的Nginx是和Gunicorn通信,所以多半不需要这个,不过无所谓,反正这个默认也是包含了,所以不需要管这个。
http_uwsgi_module
是 Nginx 的一个模块,用于与 uWSGI 服务器通信,实现通过 uWSGI 协议与后端应用程序进行交互。uWSGI 是一个用于将 Web 服务器与应用程序框架(如Django、Flask等)连接的通信协议。
以下是 http_uwsgi_module
的主要作用:
-
与 uWSGI 服务器通信: 允许 Nginx 通过 uWSGI 协议与后端的 uWSGI 服务器进行通信,以处理动态生成的内容。
-
支持多种应用程序框架: uWSGI 协议是一个通用的协议,因此
http_uwsgi_module
可以与多种应用程序框架一起使用,如 Django、Flask、Pyramid 等。 -
性能和灵活性: uWSGI 提供了与应用程序框架的高性能通信,支持持久连接和多种传输协议,提高了性能并降低了资源消耗。
以下是一个简单的 Nginx 配置示例,使用 http_uwsgi_module
与 uWSGI 服务器通信:
server {listen 80;server_name example.com;location / {try_files $uri $uri/ @uwsgi;}location @uwsgi {include uwsgi_params;uwsgi_pass unix:/var/run/uwsgi.sock;}# 其他配置...
}
在上述示例中:
location @uwsgi
定义了与 uWSGI 服务器通信的位置块。uwsgi_pass unix:/var/run/uwsgi.sock;
指定了与 uWSGI 服务器通信的 uWSGI 服务器地址。include uwsgi_params;
包含了 uWSGI 相关的参数。
这是一个基本的配置示例,具体的配置取决于你的后端 uWSGI 服务器的类型和配置。
03-043:http_scgi_module
多半不会用这个,但是默认是包含的,所以不需要管这个。
http_scgi_module
是 Nginx 的一个模块,用于与 SCGI(Simple Common Gateway Interface)服务器通信,实现通过 SCGI 协议与后端应用程序进行交互。SCGI 是一种通信协议,类似于 FastCGI,它定义了 Web 服务器与应用程序之间的简单接口。
以下是 http_scgi_module
的主要作用:
-
与 SCGI 服务器通信: 允许 Nginx 通过 SCGI 协议与后端的 SCGI 服务器进行通信,以处理动态生成的内容。
-
支持多种编程语言: SCGI 协议是一种通用的协议,因此
http_scgi_module
可以与多种编程语言一起使用,例如 Python、Perl 等。 -
性能和灵活性: SCGI 提供了与应用程序的高性能通信,支持持久连接,提高了性能并降低了资源消耗。
以下是一个简单的 Nginx 配置示例,使用 http_scgi_module
与 SCGI 服务器通信:
server {listen 80;server_name example.com;location / {include scgi_params;scgi_pass localhost:4000;}# 其他配置...
}
在上述示例中:
location /
定义了与 SCGI 服务器通信的位置块。scgi_pass localhost:4000;
指定了与 SCGI 服务器通信的 SCGI 服务器地址。include scgi_params;
包含了 SCGI 相关的参数。
这是一个基本的配置示例,具体的配置取决于你的后端 SCGI 服务器的类型和配置。
03-044:http_grpc_module
因为不需要,所以不需要管它启没启用。
http_grpc_module 模块允许将请求传递给 gRPC 服务器(1.13.10)。该模块需要 ngx_http_v2_module 模块。
03-045:http_memcached_module
因为不需要,所以不需要管它启没启用。
http_memcached_module
是 Nginx 的一个模块,用于与 Memcached 服务器通信。Memcached 是一种高性能的分布式内存对象缓存系统,用于缓存数据并加速应用程序的访问速度。
以下是 http_memcached_module
的主要作用:
-
与 Memcached 服务器通信: 允许 Nginx 通过 Memcached 协议与后端的 Memcached 服务器进行通信,以实现对缓存数据的读取和写入。
-
缓存加速: 将 Memcached 作为缓存后端,可以加速动态内容的生成和提高响应速度。通过将经常访问的数据缓存到 Memcached 中,可以减轻后端服务器的负载。
以下是一个简单的 Nginx 配置示例,使用 http_memcached_module
与 Memcached 服务器通信:
http {server {listen 80;server_name example.com;location / {set $memcached_key $uri;memcached_pass memcached_server:11211;default_type text/html;error_page 404 = @fallback;}location @fallback {proxy_pass http://backend_server;# 其他配置...}}upstream backend_server {server backend1.example.com;server backend2.example.com;# 可以添加更多的后端服务器...}
}
在上述示例中:
location /
定义了与 Memcached 服务器通信的位置块。memcached_pass memcached_server:11211;
指定了与 Memcached 服务器通信的 Memcached 服务器地址和端口。set $memcached_key $uri;
设置了 Memcached 存储的键,通常使用请求的 URI 作为键。error_page 404 = @fallback;
当请求返回 404 时,跳转到@fallback
位置块。proxy_pass http://backend_server;
在@fallback
位置块中,将请求代理到后端服务器。
这是一个基本的配置示例,具体的配置可能需要根据你的应用程序的需要进行调整。
03-046:http_limit_conn_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
http_limit_conn_module
是 Nginx 的一个模块,用于限制客户端的并发连接数。它可以帮助防止恶意攻击、提高服务器的稳定性,以及保护后端资源免受过多的请求压力。
以下是 http_limit_conn_module
的主要作用:
-
限制并发连接数: 允许你为特定的 IP 地址、CIDR 前缀、或者其他标识符设置并发连接数的限制。
-
防止过多的请求: 通过限制来自单个客户端的并发连接数,可以防止某些恶意行为,例如爆破攻击、DDoS 攻击等。
-
保护后端资源: 限制并发连接数可以确保后端服务器不会因为太多的连接而过载,提高系统的可靠性和性能。
以下是一个简单的 Nginx 配置示例,使用 http_limit_conn_module
限制并发连接数:
http {limit_conn_zone $binary_remote_addr zone=addr:10m;server {listen 80;server_name example.com;location / {limit_conn addr 5;# 其他配置...}}
}
在上述示例中:
-
limit_conn_zone $binary_remote_addr zone=addr:10m;
创建了一个名为addr
的共享内存区域,用于存储 IP 地址的连接状态信息,最多占用 10MB 内存。 -
limit_conn addr 5;
指定了对于每个 IP 地址,最多允许 5 个并发连接。超过这个限制的连接将被延迟或拒绝,具体取决于配置。
这是一个基本的配置示例,具体的配置可以根据你的需求进行调整。可以根据不同的 location
块设置不同的限制,也可以调整共享内存区域的大小和其他参数。
03-047:http_limit_req_module
需要这个模块,但是默认是包含的,所以不需要手动指定。
关于这个模块,我作了详细的研究,详情见:https://blog.csdn.net/wenhao_ir/article/details/134913876
http_limit_req_module
是 Nginx 的一个模块,用于限制请求的速率。它可以帮助防止恶意攻击,保护服务器免受过多的请求压力,以及确保服务的可靠性。
以下是 http_limit_req_module
的主要作用:
-
限制请求速率: 允许你为特定的 IP 地址、CIDR 前缀、或者其他标识符设置请求的速率限制。
-
防止过多的请求: 通过限制请求速率,可以防止某些恶意行为,例如爆破攻击、DDoS 攻击等。
-
保护后端资源: 限制请求速率可以确保后端服务器不会因为太多的请求而过载,提高系统的可靠性和性能。
以下是一个简单的 Nginx 配置示例,使用 http_limit_req_module
限制请求速率:
http {limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;server {listen 80;server_name example.com;location / {limit_req zone=req_zone burst=5;# 其他配置...}}
}
在上述示例中:
-
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
创建了一个名为req_zone
的共享内存区域,用于存储 IP 地址的请求状态信息,最多占用 10MB 内存,速率为每秒 1 个请求。 -
limit_req zone=req_zone burst=5;
指定了对于每个 IP 地址,允许每秒 1 个请求,但是允许瞬时突发(burst)最多 5 个请求。如果请求速率超过了限制,多余的请求将被延迟或拒绝,具体取决于配置。
这是一个基本的配置示例,具体的配置可以根据你的需求进行调整。可以根据不同的 location
块设置不同的限制,也可以调整共享内存区域的大小和其他参数。
03-048:http_empty_gif_module
因为不需要,所以不需要管它启没启用。
http_empty_gif_module
不是 Nginx 的官方模块,而是一种常见的自定义模块或技巧。通常,用于创建 1x1 像素的透明 GIF 图片,它被用作一种轻量级的“响应”。
这个技巧的应用场景通常是在 web 页面中用于一些像是跟踪(tracking)或者统计的目的。它的原理是,通过让客户端请求一个极小且透明的 GIF 图片,服务器可以记录请求的相关信息,比如用户访问某个页面、打开邮件等。
下面是一个可能使用该技巧的 Nginx 配置示例:
server {listen 80;server_name example.com;location /tracking-pixel.gif {empty_gif;# 其他配置...}# 其他配置...
}
在这个例子中,当客户端请求 /tracking-pixel.gif
路径时,empty_gif
指令会告诉 Nginx 返回一个透明的 1x1 像素的 GIF 图片,通常这个图片是空的,没有实际内容。这个请求的目的通常是为了记录客户端的活动,而不会影响页面的外观。
需要注意的是,empty_gif
指令并不是标准的 Nginx 模块,而是一种在 Nginx 配置中使用的自定义指令。这种技巧在实现上可以通过配置一个返回 1x1 像素的透明 GIF 图片的 location 来实现。实际上,可以直接使用一个真实的 1x1 像素的透明 GIF 图片,而不一定非要通过模块或指令来实现。
03-049:http_browser_module
因为不需要,所以不需要管它启没启用。
broswer模块主要作用是根据http请求头中"User-Agent"的值,以浏览器的特征字符来判断新旧浏览器,并生成对应的变量,以供后续的请求处理逻辑来使用。
详情请参阅:https://zhuanlan.zhihu.com/p/355305327
03-050:http_upstream_hash_module
因为不需要,所以不需要管它启没启用。
http_upstream_hash_module
是 Nginx 的一个模块,用于提供基于哈希算法的负载均衡。它允许你根据请求的特定属性(例如客户端 IP、URI等)将请求分发到一组后端服务器中的特定服务器。
以下是 http_upstream_hash_module
的主要作用:
-
哈希算法的负载均衡: 通过哈希算法,将特定属性(如客户端 IP、URI等)映射到一组后端服务器中的特定服务器,实现请求的负载均衡。
-
会话保持: 哈希算法的使用允许在相同的属性上产生相同的哈希值,从而将相同的请求路由到相同的后端服务器。这有助于保持与特定客户端的会话状态。
以下是一个简单的 Nginx 配置示例,使用 http_upstream_hash_module
进行哈希负载均衡:
http {upstream backend {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;server backend3.example.com;# 可以添加更多的后端服务器...}server {listen 80;server_name example.com;location / {proxy_pass http://backend;# 其他配置...}}
}
在上述示例中:
-
hash $request_uri consistent;
配置了哈希算法,使用请求的 URI 作为哈希的关键属性。consistent
关键字表示使用一致性哈希算法。 -
upstream backend
定义了一个后端服务器组,其中包含多个服务器。 -
proxy_pass http://backend;
将请求代理到名为backend
的后端服务器组,根据哈希算法选择后端服务器。
这是一个基本的配置示例,具体的配置可以根据你的需求进行调整,比如选择其他属性作为哈希的关键属性。
03-051:http_upstream_ip_hash_module
因为不需要,所以不需要管它启没启用。
http_upstream_ip_hash_module
是 Nginx 的一个模块,用于提供基于客户端 IP 地址的哈希负载均衡。这个模块允许将来自相同 IP 地址的请求分发到同一组后端服务器中的同一台服务器。这样可以确保来自同一客户端的请求被路由到相同的后端服务器,有助于保持特定客户端的会话状态。
以下是 http_upstream_ip_hash_module
的主要作用:
-
IP 地址哈希负载均衡: 通过哈希算法,将客户端 IP 地址映射到一组后端服务器中的特定服务器,实现基于 IP 地址的负载均衡。
-
会话保持: 哈希算法的使用允许在相同的客户端 IP 地址上产生相同的哈希值,从而将相同客户端 IP 的请求路由到相同的后端服务器。这有助于保持与特定客户端的会话状态。
以下是一个简单的 Nginx 配置示例,使用 http_upstream_ip_hash_module
进行 IP 地址哈希负载均衡:
http {upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;# 可以添加更多的后端服务器...}server {listen 80;server_name example.com;location / {proxy_pass http://backend;# 其他配置...}}
}
在上述示例中:
-
ip_hash;
配置了 IP 地址哈希算法,该算法使用客户端 IP 地址作为哈希的关键属性。 -
upstream backend
定义了一个后端服务器组,其中包含多个服务器。 -
proxy_pass http://backend;
将请求代理到名为backend
的后端服务器组,根据 IP 地址哈希算法选择后端服务器。
这是一个基本的配置示例,具体的配置可以根据你的需求进行调整。这种方法通常用于需要确保来自同一客户端 IP 的请求被路由到同一台后端服务器的场景,以保持会话状态。
03-052:http_upstream_least_conn_module
—根据连接数进行负载均衡
因为不需要,所以不需要管它启没启用。
http_upstream_least_conn_module
是 Nginx 的一个模块,用于提供基于最少连接数的负载均衡。这个模块会将新的请求分发到当前连接数最少的后端服务器上,以达到负载均衡的目的。
以下是 http_upstream_least_conn_module
的主要作用:
-
最少连接数负载均衡: 通过跟踪每个后端服务器的当前连接数,将新的请求分发到当前连接数最少的服务器上,从而实现最小连接数的负载均衡。
-
动态适应: 该算法可以自动适应后端服务器的负载情况,确保请求更均匀地分布在各个服务器上,从而提高整体性能。
以下是一个简单的 Nginx 配置示例,使用 http_upstream_least_conn_module
进行最少连接数负载均衡:
http {upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;# 可以添加更多的后端服务器...}server {listen 80;server_name example.com;location / {proxy_pass http://backend;# 其他配置...}}
}
在上述示例中:
-
least_conn;
配置了最少连接数的负载均衡算法。 -
upstream backend
定义了一个后端服务器组,其中包含多个服务器。 -
proxy_pass http://backend;
将请求代理到名为backend
的后端服务器组,根据最少连接数算法选择后端服务器。
这是一个基本的配置示例,具体的配置可以根据你的需求进行调整。这种方法通常用于希望确保请求能够分布到连接数较少的服务器上,以避免连接过载的场景。
03-053:http_upstream_random_module
因为不需要,所以不需要管它启没启用。
与前面几个模块类似,与负载均衡有关。其实是Nginx作为反向代理时可能用到的功能。
03-054:http_upstream_keepalive_module
因为不需要,所以不需要管它启没启用。
与前面几个模块类似,与负载均衡有关。其实是Nginx作为反向代理时可能用到的功能。
03-056:http_upstream_zone_module
因为不需要,所以不需要管它启没启用。
与前面几个模块类似,与负载均衡有关。其实是Nginx作为反向代理时可能用到的功能。
03-057:http_perl_module
因为不需要,所以不需要管它启没启用。
http_perl_module
是 Nginx 的一个模块,允许在 Nginx 配置中使用 Perl 语言编写的代码块,以扩展 Nginx 的功能。通过这个模块,你可以在 Nginx 中嵌入 Perl 代码来实现更复杂的请求处理逻辑、动态内容生成等功能。
以下是 http_perl_module
的主要作用:
-
动态请求处理: 允许使用 Perl 编写代码块来处理请求,实现更复杂的逻辑和业务规则。
-
自定义变量和指令: 允许通过 Perl 扩展 Nginx 的配置语法,添加自定义变量和指令。
-
与其他 Perl 模块集成: 通过
http_perl_module
,你可以轻松集成其他 Perl 模块,以实现更多的功能。
以下是一个简单的 Nginx 配置示例,使用 http_perl_module
:
http {perl_modules perl/lib;server {listen 80;server_name example.com;location / {perl my_handler;# 其他配置...}}
}perl_require perl/lib/my_handler.pl;sub my_handler {my $r = shift;$r->send_http_header('text/plain');$r->print("Hello, Perl in Nginx!");return OK;
}
在上述示例中:
-
perl_modules perl/lib;
指定了 Perl 模块的存放路径。 -
perl my_handler;
在location /
中使用 Perl 代码块处理请求。 -
perl_require perl/lib/my_handler.pl;
引入了 Perl 文件my_handler.pl
,其中包含了my_handler
子例程的实现。 -
my_handler
子例程中,通过 Perl 代码生成了一个简单的 “Hello, Perl in Nginx!” 的响应。
这是一个基本的配置示例,具体的配置和代码实现可以根据需要进行调整。使用 http_perl_module
时,需要注意性能和安全性,避免引入不必要的复杂性。
03-058:--without-http
这个显然是不能启用的。
在 Nginx 的配置语句中,without-http
是一个用于禁用 HTTP 核心模块的配置参数。它通常与 ./configure
命令一起使用,用于在编译 Nginx 时选择性地禁用 HTTP 相关的模块和功能,以减小 Nginx 的二进制文件大小。
在配置 Nginx 编译选项时,你可以通过 ./configure
命令来启用或禁用特定模块。如果你使用 without-http
,它会禁用所有与 HTTP 相关的模块,包括核心 HTTP 模块以及其他与 HTTP 服务相关的模块。
以下是一个示例,演示了如何使用 without-http
配置参数:
./configure --without-http
make
make install
在这个例子中,通过 --without-http
参数告诉编译系统不编译和包含 HTTP 模块。这可以用于构建一个仅支持 TCP/UDP 代理或其他非 HTTP 协议的 Nginx 二进制文件。
请注意,禁用 HTTP 模块会导致 Nginx 失去对 HTTP 请求的支持,因此这样的配置适用于一些特定的使用场景,比如构建仅用于 TCP 代理的 Nginx 实例。如果你需要支持 HTTP 请求,不要使用 without-http
。
03-059:with-mail
因为不需要,所以不需要管它启没启用。
with-mail
是 Nginx 的配置参数之一,通常与 ./configure
命令一起使用,用于在编译 Nginx 时启用邮件代理相关的功能。当使用 --with-mail
参数时,编译系统会启用与邮件相关的模块,使得 Nginx 能够作为邮件代理服务器(Mail Proxy)运行。
以下是一个示例,演示了如何使用 with-mail
配置参数:
./configure --with-mail
make
make install
在这个例子中,通过 --with-mail
参数告诉编译系统编译和包含与邮件服务相关的模块,例如 ngx_mail_module
。这使得 Nginx 能够处理 SMTP(Simple Mail Transfer Protocol)和其他邮件相关的协议。
启用邮件模块后,你可以在 Nginx 配置中使用与邮件相关的指令和模块,例如配置邮件代理、进行邮件流量的负载均衡等。
需要注意的是,with-mail
是一个编译时的选项,你需要在编译 Nginx 时明确指定该选项,以便在生成的二进制文件中包含邮件模块的支持。如果你不需要 Nginx 具备邮件代理的功能,可以选择不使用 with-mail
参数。
问:用Django编写的网站,在用户注册时需要向用户的邮箱发送验证码,那么是不是必须要用Nginx的邮箱模块?
不,你并不需要使用 Nginx 的邮箱模块来发送验证码邮件。Nginx 主要是一个高性能的 Web 服务器和反向代理服务器,它本身并不处理电子邮件的发送功能。在 Django 应用中,发送验证码邮件通常通过使用邮件服务提供商或者本地邮件服务器来完成。
以下是一般的流程:
-
配置 Django 设置: 在 Django 项目的设置文件中,你需要配置邮件发送的相关参数,包括邮件服务器地址、端口、认证信息等。这通常在
settings.py
文件中完成,例如:# settings.pyEMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'your_smtp_server.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your_email@example.com' EMAIL_HOST_PASSWORD = 'your_email_password'
上述设置使用了 SMTP 协议,你需要替换为你的实际邮件服务器信息。
-
使用 Django 发送邮件: 在 Django 视图或其他逻辑中,你可以使用 Django 提供的
send_mail
函数来发送邮件。例如:# views.pyfrom django.core.mail import send_maildef send_verification_email(email, verification_code):subject = 'Verify Your Account'message = f'Your verification code is {verification_code}.'from_email = 'your_email@example.com'recipient_list = [email]send_mail(subject, message, from_email, recipient_list)
在用户注册或需要发送验证码的地方调用
send_verification_email
函数即可。 -
选择邮件服务提供商: 你也可以使用第三方的邮件服务提供商,例如 SendGrid、Mailgun、SMTP.com 等,这些服务提供了稳定的邮件发送服务,通常有更好的可靠性和性能。在这种情况下,你需要根据提供商的文档配置 Django 的邮件设置,并使用提供商的 API 来发送邮件。
总之,你不需要使用 Nginx 的邮箱模块来实现 Django 中的邮件发送功能,而是通过 Django 提供的邮件功能或者第三方邮件服务提供商完成邮件发送。
03-060:with-stream
-处理非 HTTP 协议的流量
因为不需要,所以不需要管它启没启用。
--with-stream
是 Nginx 的编译参数之一,用于启用 Stream 模块。Stream 模块允许 Nginx 作为 TCP 和 UDP 的代理,从而可以处理非 HTTP 协议的流量,例如数据库连接、邮件协议等。
在使用 --with-stream
编译参数时,编译系统会启用 Stream 模块,使得 Nginx 能够处理 TCP 和 UDP 流量。这样,Nginx 就能够实现更为灵活的代理和负载均衡功能,不仅局限于 HTTP 协议。
以下是一个简单的示例,演示如何使用 --with-stream
:
./configure --with-stream
make
make install
在这个例子中,通过 --with-stream
参数告诉编译系统编译和包含与 Stream 模块相关的功能。这使得 Nginx 能够处理 TCP 和 UDP 流量,而不仅仅局限于 HTTP 协议。
Stream 模块提供了一些配置指令,例如 stream
块,用于配置 TCP 或 UDP 代理。以下是一个简单的 Nginx 配置示例,使用 Stream 模块实现 TCP 代理:
stream {server {listen 12345;proxy_pass backend_server:5678;}
}
在上述示例中,listen 12345;
指定了 Nginx 监听的端口,而 proxy_pass backend_server:5678;
则将流量代理到后端服务器的 5678 端口。
总的来说,--with-stream
参数的作用是启用 Nginx 的 Stream 模块,使其能够处理 TCP 和 UDP 流量,提供了更广泛的代理和负载均衡功能。
03-061:google_perftools_module
因为不需要,所以不需要管它启没启用。
截至我了解的知识截止日期(2022 年初),google_perftools_module
不是 Nginx 官方的模块,而是由社区提供的第三方模块。这个模块与 Google 性能工具(Google Performance Tools)相关。
Google 性能工具是一套用于性能分析和性能优化的开源工具。其中的 gperftools
库提供了一些用于分析 CPU、内存和堆栈的工具,包括 pprof
(性能剖析工具)和 tcmalloc
(线程安全的内存分配器)等。
google_perftools_module
通常与 Nginx 一起使用,通过 Nginx 的模块机制,将 Google 性能工具集成到 Nginx 中,从而实现对 Nginx 运行时性能的分析和监控。
以下是 google_perftools_module
的一些可能的功能和作用:
-
性能剖析(Profiling): 使用
pprof
工具,可以对 Nginx 的运行时性能进行剖析,了解函数调用关系、CPU 占用情况等,以帮助识别性能瓶颈。 -
内存分析: 如果启用了
tcmalloc
,则可以监控 Nginx 进程的内存使用情况,帮助发现内存泄漏或者优化内存分配。 -
线程安全内存分配:
tcmalloc
提供了线程安全的内存分配器,可以在多线程环境下更高效地进行内存分配。 -
内存堆栈分析:
tcmalloc
可以生成内存堆栈信息,帮助定位内存分配的位置,有助于调查内存相关的问题。
注意,具体的使用方法和配置可能会因为不同的 Nginx 版本和模块版本而有所不同。如果你打算使用 google_perftools_module
,建议查阅官方文档或者相关社区资源以获取最新的信息和配置示例。
03-062:cpp_test_module
因为不需要,所以不需要管它启没启用。
截至我了解的知识截止日期(2022 年初),cpp_test_module
不是 Nginx 官方的模块,而是一个示例模块,用于演示如何使用 C++ 编写 Nginx 模块。这个模块并不提供实际的功能,而是为了帮助开发者了解如何使用 C++ 扩展 Nginx 的功能。
在 Nginx 的模块开发中,官方通常使用 C 语言编写模块,因为 Nginx 主体本身是使用 C 编写的。但是,通过一些额外的工作,你可以使用 C++ 来编写 Nginx 模块,以充分利用 C++ 的面向对象特性和其他功能。
如果你对使用 C++ 编写 Nginx 模块感兴趣,可以参考这个 cpp_test_module
示例,了解如何结合 Nginx 源代码中的模块开发接口和 C++ 的特性。请注意,这可能涉及到更多的复杂性,因为 Nginx 本身是以 C 语言为基础的。
以下是一个简单的示例,演示如何使用 cpp_test_module
:
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>extern "C" {static ngx_int_t ngx_http_cpp_test_handler(ngx_http_request_t *r);static char *ngx_http_cpp_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static ngx_int_t ngx_http_cpp_test_init(ngx_conf_t *cf);
}static ngx_command_t ngx_http_cpp_test_commands[] = {{ngx_string("cpp_test"),NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,ngx_http_cpp_test,NGX_HTTP_LOC_CONF_OFFSET,0,NULL},ngx_null_command
};static ngx_http_module_t ngx_http_cpp_test_module_ctx = {NULL, /* preconfiguration */ngx_http_cpp_test_init, /* postconfiguration */NULL, /* create main configuration */NULL, /* init main configuration */NULL, /* create server configuration */NULL, /* merge server configuration */NULL, /* create location configuration */NULL /* merge location configuration */
};ngx_module_t ngx_http_cpp_test_module = {NGX_MODULE_V1,&ngx_http_cpp_test_module_ctx, /* module context */ngx_http_cpp_test_commands, /* module directives */NGX_HTTP_MODULE, /* module type */NULL, /* init master */NULL, /* init module */NULL, /* init process */NULL, /* init thread */NULL, /* exit thread */NULL, /* exit process */NULL, /* exit master */NGX_MODULE_V1_PADDING
};static ngx_int_t ngx_http_cpp_test_handler(ngx_http_request_t *r) {// 处理请求的逻辑ngx_http_send_header(r);ngx_http_output_filter(r, NULL);return NGX_OK;
}static char *ngx_http_cpp_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_loc_conf_t *clcf;clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);clcf->handler = ngx_http_cpp_test_handler;return NGX_CONF_OK;
}static ngx_int_t ngx_http_cpp_test_init(ngx_conf_t *cf) {// 模块初始化逻辑return NGX_OK;
}
这只是一个简单的示例,实际上,编写 C++ Nginx 模块可能涉及更复杂的问题,包括正确处理内存管理、异常处理、链接问题等。在实际项目中,你可能需要深入研究 Nginx 的模块开发接口以及 C++ 的特性。如果你有特定的问题或需求,建议参考官方文档和相关资源。
03-063:--add-module=PATH
这个就是添加第三方或自己自定义的模块了。在我的另一篇博文中安装geoip2模块就是用的这个。
详情见:https://blog.csdn.net/wenhao_ir/article/details/134951013
03-064:--with-compat
考虑良久,我觉得这个模块应该是一开始不启用,如果在添加第三方模块时出现不兼容的情况时再启用。
--with-compat
是 Nginx 配置参数之一,它用于编译 Nginx 时启用兼容性模块。这个参数通常用于将旧版本的 Nginx 模块和第三方模块编译到新版本的 Nginx 中,以确保模块在新版本上的兼容性。
当你升级 Nginx 到新版本时,可能会遇到一些模块不再与新版本兼容的问题。为了解决这个问题,Nginx 提供了 --with-compat
参数,用于兼容旧版本的模块。
以下是一个简单的示例,演示了如何使用 --with-compat
:
./configure --with-compat
make
make install
通过使用 --with-compat
参数,编译系统会尽可能地保持与旧版本的 Nginx 的二进制模块兼容。这样,你就可以在新版本的 Nginx 中使用旧版本的模块,而无需对模块进行修改或重新编译。
需要注意的是,尽管 --with-compat
提供了一定的兼容性支持,但并不是所有的模块都能完全兼容。有时,特定的模块可能需要进行适应性调整或更新,以适应新版本的 Nginx。
总体而言,--with-compat
是一个用于提高模块兼容性的有用选项,但在使用时,最好查阅相关的官方文档和模块的更新信息,以确保正确地管理模块的兼容性。
03-065:--with-pcre
这个参数并不需要显示指定,因为Nginx默认会启用它,并且会去系统中寻找pcre库,如下图所示:
--with-pcre
是 Nginx 的配置参数之一,用于启用 PCRE(Perl Compatible Regular Expressions)库支持。PCRE 是一个用于处理正则表达式的库,它兼容 Perl 正则表达式语法,并提供了强大的正则表达式功能。
当你在编译 Nginx 时使用 --with-pcre
参数,编译系统会链接 PCRE 库,从而使 Nginx 能够在配置文件中使用 PCRE 正则表达式。这样,你可以在 Nginx 配置中利用强大的正则表达式功能来进行 URL 匹配、重定向、映射等操作。
以下是一个简单的示例,演示了如何使用 --with-pcre
:
./configure --with-pcre
make
make install
在这个例子中,通过 --with-pcre
参数告诉编译系统在编译 Nginx 时启用 PCRE 库的支持。
在 Nginx 的配置文件中,你可以使用正则表达式来匹配和处理请求。例如:
location ~ /images/ {# 匹配以 /images/ 开头的 URL# 其他配置...
}
在这个例子中,~
表示使用正则表达式匹配,/images/
是正则表达式,匹配以 /images/
开头的 URL。
总的来说,--with-pcre
参数用于启用 PCRE 正则表达式库支持,使得 Nginx 能够更灵活地利用正则表达式进行配置和处理。
03-066:--with-zlib=DIR
这个参数和上一个参数--with-pcre
一样,不需要显示指定,因为Nginx同样会去寻找系统中的zlib库,如下图所示:
--with-zlib=DIR
是 Nginx 的配置参数之一,用于指定 zlib 库的安装路径。zlib 是一个用于数据压缩和解压缩的开源库,它广泛用于许多应用程序,包括 Web 服务器,以提高传输效率。
当你在编译 Nginx 时使用 --with-zlib=DIR
参数,你需要提供 zlib 库的安装路径。这告诉编译系统在构建 Nginx 时去指定路径查找 zlib 库,并将其链接到 Nginx 二进制文件中。
以下是一个简单的示例,演示了如何使用 --with-zlib=DIR
:
./configure --with-zlib=/path/to/zlib
make
make install
在这个例子中,/path/to/zlib
是 zlib 库的安装路径。通过使用 --with-zlib
参数,你告诉编译系统在指定路径查找 zlib 库。
zlib 在 Nginx 中的主要用途是对 HTTP 响应进行压缩,以减小传输数据的大小,提高网站的加载速度。当客户端支持压缩时,Nginx 可以使用 zlib 对响应进行 gzip 或者 deflate 压缩,然后传输给客户端,客户端再进行解压缩。这可以通过 Nginx 配置中的 gzip
相关指令来控制。
总的来说,--with-zlib=DIR
参数用于启用 zlib 库支持,并指定 zlib 库的安装路径。这使得 Nginx 能够在编译时正确链接 zlib 库,以便在运行时使用 zlib 的压缩和解压缩功能。
03-067:--with-libatomic
因为不需要,所以不需要管它启没启用。
个人感觉不需要,因为下面说了,一般情况下,可能不需要显式指定这个参数,因为在Centos7.9系统上,编译器已经提供了对原子操作的内置支持。
--with-libatomic
是 Nginx 的配置参数之一,用于启用对 libatomic 库的支持。libatomic 是一个用于原子操作的库,它提供了一些原子操作的函数,可用于确保多线程程序中对共享数据的安全操作。
在多线程环境中,当多个线程同时访问和修改共享数据时,可能发生竞态条件(Race Condition),导致数据不一致或其他问题。libatomic 提供了原子操作,这些操作能够在不需要锁的情况下确保对共享数据的操作是原子的,从而避免竞态条件。
使用 --with-libatomic
参数编译 Nginx 时,会链接 libatomic 库,以便在 Nginx 中使用 libatomic 提供的原子操作。这对于一些并发性能优化是有益的,尤其是在多核系统上运行的高并发 Nginx 实例。
以下是一个简单的示例,演示了如何使用 --with-libatomic
:
./configure --with-libatomic
make
make install
在这个例子中,通过 --with-libatomic
参数告诉编译系统在编译 Nginx 时启用 libatomic 库的支持。
需要注意的是,并非所有系统都需要显式启用 libatomic 支持,因为在某些系统上,编译器已经提供了对原子操作的内置支持。在一些特定的环境中,使用 --with-libatomic
可能对 Nginx 的性能产生积极的影响,但在一般情况下,可能不需要显式指定这个参数。在编译 Nginx 之前,建议查看系统的文档或相关的编译选项,以了解是否需要显式启用 libatomic。
问:Centos7.9提供原子操作的支持没有?
CentOS 7.9 提供了对原子操作的支持,但是这取决于所使用的硬件和编译器。在现代的 x86_64 架构上,通常使用的 GCC 编译器会使用硬件指令来提供原子操作,而无需额外的库支持。
在 CentOS 7.9 中,GCC 版本是相对较旧的 4.8.5,但它仍然支持在 x86_64 上进行原子操作。因此,对于一般用途,你通常不需要显式启用 --with-libatomic
。
如果你在编译 Nginx 时遇到原子操作相关的问题,建议首先尝试使用默认设置,因为大多数情况下 GCC 会自动使用硬件支持提供原子操作。如果在使用默认设置时出现问题,你可以考虑使用 --with-libatomic
参数启用 libatomic 支持。
在编译 Nginx 之前,你可以查看系统上已安装的 GCC 版本,并考虑是否需要更新 GCC 到更新的版本。在一般情况下,较新版本的 GCC 通常提供更好的性能和一些新的特性。
03-068:--with-openssl=DIR
这个参数不需要显示指定,因为Nginx会到系统中去找寻openssl库,如下图所示:
--with-openssl=DIR
是 Nginx 的配置参数之一,用于指定 OpenSSL 库的安装路径。OpenSSL 是一个提供安全套接字层(SSL)和传输层安全性(TLS)协议的开源工具包,它通常用于加密网络通信,提供安全的数据传输。
当你在编译 Nginx 时使用 --with-openssl=DIR
参数,你需要提供 OpenSSL 库的安装路径。这告诉编译系统在构建 Nginx 时去指定路径查找 OpenSSL 库,并将其链接到 Nginx 二进制文件中。
以下是一个简单的示例,演示了如何使用 --with-openssl=DIR
:
./configure --with-openssl=/path/to/openssl
make
make install
在这个例子中,/path/to/openssl
是 OpenSSL 库的安装路径。通过使用 --with-openssl
参数,你告诉编译系统在指定路径查找 OpenSSL 库。
OpenSSL 在 Nginx 中的主要用途是加密和解密 HTTPS 流量。当你在 Nginx 配置文件中启用 SSL/TLS 配置时,Nginx 将使用 OpenSSL 提供的加密算法来保护数据传输的安全性。
总的来说,--with-openssl=DIR
参数用于启用 OpenSSL 库支持,并指定 OpenSSL 库的安装路径。这使得 Nginx 能够在编译时正确链接 OpenSSL 库,以便在运行时使用其加密和解密功能。
03-069:--with-debug
因为不需要,所以不需要管它启没启用。
--with-debug
是 Nginx 的配置参数之一,用于在编译 Nginx 时启用调试信息。使用这个参数会使 Nginx 在二进制文件中包含更多的调试信息,以便在出现问题时更容易进行故障排除和调试。
以下是一个简单的示例,演示了如何使用 --with-debug
:
./configure --with-debug
make
make install
通过使用 --with-debug
参数,编译系统会在 Nginx 二进制文件中包含额外的调试信息。这些信息包括变量名、行号等,有助于在调试器中分析代码执行的具体情况。
在生产环境中,通常不建议在 Nginx 上启用调试模式,因为这会增加二进制文件的大小,同时也可能影响性能。在生产环境中,你应该使用没有 --with-debug
参数的正常配置进行编译。
而在开发环境或者在需要进行故障排除时,使用 --with-debug
参数可以提供更详细的调试信息,以帮助开发者定位和解决问题。
总体来说,--with-debug
参数用于在编译 Nginx 时包含调试信息,以便在需要时进行故障排除和调试。