内容提要
本文介绍Ubuntu下Nginx源码编译安装与优化:安装PCRE、zlib、OpenSSL等依赖,下载解压后修改版本号与Server头信息,configure编译安装并配置systemd服务;随后关闭版本信息、设置用户、优化进程与事件模型、开启GZIP、配置代理、HTTPS、限流及系统内核参数,并用脚本按天分割日志。
延伸解读
编译前依赖库的作用与选择
文章指出,PCRE库用于支持正则表达式,若nginx.conf中使用正则,则编译时必须包含PCRE;zlib库用于GZIP压缩,若配置gzip on,则需编译zlib;OpenSSL用于HTTPS及MD5、SHA1等散列函数。因此,在编译前应根据实际需求安装这些依赖,避免功能缺失。
版本分支的选择建议
文章将Nginx版本分为mainline、stable和legacy:mainline版本号中间数字为奇数,更新快但稳定性稍差;stable版本中间数字为偶数,经过长时间测试,适合商业化环境;legacy为遗留老版本。用户应根据稳定性和功能需求选择,生产环境建议使用stable版本。
隐藏版本信息时的配置冲突
文章提到,通过修改源码可以自定义Server头信息,但若在nginx.conf中设置server_tokens off,Nginx会将整个Server头替换为“Server: nginx”,导致源码修改失效。作者指出目前未找到好的解决办法,建议要么只关闭版本信息而不修改Server头,要么设置server_tokens on使修改生效,二者选一。
性能与安全优化要点
文章介绍了多项优化配置:设置worker_processes auto和worker_cpu_affinity auto以利用多核;调整worker_priority和worker_rlimit_nofile;启用sendfile、tcp_nopush和tcp_nodelay;开启GZIP压缩并设置压缩级别和类型;配置HTTPS会话缓存和超时;使用limit_req_zone进行限流;添加X-Frame-Options等安全头;以及调整系统内核参数如tcp_syncookies和文件描述符限制。
Q&A
在Ubuntu上编译安装Nginx需要安装哪些依赖库?各自有什么作用?
需要安装build-essential、libpcre3、libpcre3-dev、zlib1g、zlib1g-dev、libssl-dev、libgd-dev、libxml2、libxml2-dev、uuid-dev等。PCRE库用于支持正则表达式,zlib库用于gzip压缩,OpenSSL用于支持HTTPS和散列函数。
如何修改Nginx源码以隐藏版本号和Server头信息?
编辑src/core/nginx.h修改NGINX_VERSION和NGINX_VER;编辑src/http/ngx_http_header_filter_module.c将Server字符串改为None;编辑src/http/ngx_http_special_response.c删除错误页中的版本信息。
Nginx的configure编译参数中--prefix和--with-http_ssl_module分别代表什么?
--prefix指定Nginx的安装路径;--with-http_ssl_module启用HTTPS支持模块。
如何为Nginx创建systemd服务文件并管理其启动、停止和重启?
创建/etc/systemd/system/nginx.service文件,写入Unit、Service、Install配置。然后使用systemctl enable/start/stop/restart/status nginx.service进行管理。
Nginx优化配置中如何设置worker进程数和事件处理模型?
设置worker_processes auto; worker_cpu_affinity auto; worker_priority -3; worker_rlimit_nofile 65535; 在events块中设置accept_mutex on; multi_accept on; use epoll; worker_connections 65535;
如何配置Nginx的GZIP压缩以提升传输效率?
在http块中设置gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 4; gzip_types text/plain text/css text/xml application/xml application/xml+rss application/json; gzip_vary on;
Nginx如何配置HTTPS并优化SSL性能?
在server块中配置listen 443 ssl; ssl_certificate和ssl_certificate_key指定证书;优化包括ssl_session_cache shared:SSL:15m; ssl_session_timeout 30m; ssl_prefer_server_ciphers off; 并启用TLSv1.2和TLSv1.3。
如何使用Nginx的limit_req_zone进行限流?
在http块中定义limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; 在location中应用limit_req zone=one burst=5 nodelay; 可设置limit_req_status自定义状态码。
如何配置Nginx日志按天分割并自动清理旧日志?
编写脚本将access.log和error.log重命名并压缩,使用nginx -s reopen重新打开日志,通过crontab定时执行,并设置find命令删除超过30天的.gz文件和超过1天的.log文件。
Nginx系统内核参数优化有哪些关键配置?
在/etc/sysctl.conf中设置net.ipv4.tcp_syncookies=1防SYN攻击,net.ipv4.ip_local_port_range=2000 65000,net.ipv4.tcp_rmem和tcp_wmem调整缓冲区,fs.file-max=65535等,执行sysctl -p生效。