:0.Nginx介绍
文章目录
1.基本配置
vim /usr/local/nginx/conf/nginx.conf
最简配置如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
- worker_processes :启动nginx后,工作进程的数量,可以加大这个数字来提高nginx的处理请求的效率,但是这个数字也不能太大,因为进程是消耗系统内存资源的。调整一下这个数字,然后通过free指令可以査看一下内存容量的变化。建议和CPU核数一致。
- worker_connections :连接数量,每个进程可以处理1024连接。
- include mime.types :引入与配置文件同级目录的 mime.types,表示nginx能识别的各种文件的类型,如mp4、jpg等,如果能被识别,则在浏览器浏览时可以用默认的方式进行展示,否则会变为下载文件。
- default_type application/octet-stream :如果有的文件类型不被识别,则以八进制文件流的方式处理。
- charset utf-8 :网站统一编码。
- server :虚拟主机,可以有多个。
- location / :根目录配置
- root html :网站的根目录,html是相对nginx安装目录 /usr/share/nginx 的,也可以使用绝对路径。
实验1.worker_processes
修改 worker_processes 为 2 后,重启nginx服务,查看进程
实验2.网站根目录
实验3.网站状态
2.server主机
2.1 基于端口
nginx配置
网页访问
2.2 基于IP
一张网卡配置两个ip测试即可
nginx配置
网页访问
2.3 基于域名
nginx配置
修改 C:\Windows\System32\drivers\etc\hosts
网页访问
3.nginx优化
3.1 隐藏 nginx版本
在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。
隐藏版本前
修改配置
隐藏版本后
3.2 配置网页缓存
当 Nginx 将网页数据返回给客户端后,可设置缓存时间,以便在日后进行相同内容的请求时直接返回,以避免重复请求,加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间。
设置缓存前
修改配置
location ~* \.(gif|jpg|jepg|bmp|png|ico)$ {
root /web/one;
expires 1d;
}
解释
设置缓存后
3.3 设置连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置keepalive_timeout 超时时间。
修改配置
keepalive_timeout 第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头 Keep-Alive: timeout=time中的 time 值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。
3.4 日志切割
随着 Nginx 运行时间的增加,产生的日志也会逐渐增加,为了方便掌握Nginx 的运行状态,需要时刻关注 Nginx 日志文件。太大的日志文件对监控是一个大灾难,不便于分析排查,需要定期的进行日志文件的切割。
方法1.自定义脚本
编写脚本,把nginx日志移动到指定位置并以日期重命名,重新加载nginx配置生成新的日志,删除30天以前的日志
#!/bin/bash
log_date=`date -d "-1 day" "+%Y%m%d"`
log_path="/var/log/nginx"
pid="/usr/local/nginx/logs/nginx.pid"
[ -d $log_path ] || mkdir -p $log_path
mv /usr/local/nginx/logs/access.log $log_path/my.com-access.log-$log_date
kill -USR1 `cat $pid`
find $log_path -mtime +30 | xargs rm -rf
利用cron定时任务,每天凌晨1:30分执行脚本
方法2.logrotate
使用外部工具,如 logrotate
来管理日志切割。
以下是一个基本的 logrotate
配置示例,用于切割 Nginx 日志文件:
- 安装
logrotate
(大多数系统已预装)。 - 创建一个 logrotate 配置文件,例如
/etc/logrotate.d/nginx
,内容如下:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ ! -f /nginx.pid ] || kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
解释:
daily
:日志文件将每天轮换一次。rotate 14
:只保存最近14天的日志。compress
:用 gzip 压缩旧的日志文件。postrotate
:轮换后运行的命令,这里是向 Nginx 主进程发送 USR1 信号,让其重新打开日志文件。
让 logrotate
守护进程定期执行任务(通常每天一次)。确保 /etc/cron.daily/logrotate
脚本存在。
这样配置后,logrotate
会自动管理 Nginx 的日志文件,每天轮换并压缩旧日志,确保日志文件不会占用太多磁盘空间。
3.5 worker 进程数
见:1.基本配置 — 实验1
worker_processes :启动nginx后,工作进程的数量,可以加大这个数字来提高nginx的处理请求的效率,但是这个数字也不能太大,因为进程是消耗系统内存资源的。调整一下这个数字,然后通过free指令可以査看一下内存容量的变化。建议和CPU核数一致。
3.6 fpm 参数优化
见:chapter04-源码编译构建LNMP/LNMP+discuz论坛.pdf — 6.其他
vim /usr/local/php/etc/php-fpm.d/www.conf
# 96行fpm进程启动方式,动态的
pm = dynamic
# 107行fpm进程启动的最大进程数
pm.max_children=20
# 112行动态方式下启动时默认开启的进程数,在最小和最大之间
pm.start_servers = 5
# 117行动态方式下最小空闲进程数
pm.min_spare_servers = 2
# 122行动态方式下最大空闲进程数
pm.max_spare_servers = 8
#重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
netstat -anpt | grep 9000
ps -elf | grep php-fpm
3.7 网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认 Nginx 已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
修改配置
- gzip on :开启 gzip 压缩输出
- gzip_min_length1k :用于设置允许压缩的页面最小字节数
- gzip_buffers 4 64k :表示申请 4 个单位为 64k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果
- gzip_http_version 1.0 :用于设置识别 http 协议版本,默认是1.1,目前大部分浏览器已经支持 gzip 解压,但处理较慢,也比较消耗服务器 CPU 资源
- gzip_comp_level 2 :用来指定 gzip 压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可
- gzip_types text/plain :压缩类型,是对哪些网页文档启用压缩功能
- gzip_vary on :选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面
当页面大于1k时,会进行压缩
4. 防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免了不必要的带宽浪费。Nginx 的防盗链功能也非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
再准备一台虚拟机(ip 192.168.9.5),安装web软件,测试盗链
修改配置
- 注意1:把图片缓存的配置去掉
- 注意1:需要配置 root 和 index,当然也可以把 location 中的 root 和 index 统一提到 server 节点
location ~* \.(gif|jpg|png|jpeg)$ {
root /web/one;
index index.html index.htm;
valid_referers *.my.com my.com;
if ($invalid_referer) {
return 403;
}
}
网页测试
5.include
自助建站服务基本情况是:公司提供服务器、公网ip、域名,然后用户在网站上注册账号,公司给用户分配子域名,帮助用户创建站点根目录,在nginx上配置虚拟主机,同时还会提供ftp服务,让用户自己可以上传网站代码。往往一个服务器上可能都能跑几百个网站,那么问题来了,每一个网站都需要在nginx主配置文件中添加一个server节点,那么nginx配置文件会变得很大,很难管理,所以要换一种方式来管理配置文件,将每个网站的配置都单独拆分出来。
修改主配置 /usr/local/nginx/conf/nginx.conf
其中一个网站的独立配置 (注:一般域名、配置文件名、站点目录名都是同名的)
网站根目录
hosts文件
此时的网站效果
假如 one 网站的用户不再继续经营了,则可以把其配置文件改名让配置不再生效,如:one.my.com.conf.stop
此时重启服务后,再次访问 one.my.com,则会访问到 two.my.com
因为二级域名相同,nginx会默认打开成功加载了配置的后的第一个网站
根据这种情况,一般会定义此域名对应的默认网站,也就是官网,上面有用户注册、收费等等功能,可以使用 default_server 来指定默认网站
6.basic 认证
通过htpasswd生成认证信息,可以实现基于用户授权的访问控制,当客户端想要访问相应网站或者目录时,要求用户输入用户名和密码才能正常访问。
可以通过提供 htpasswd 的网站在线生成认证信息,也可以安装 httpd-tools 生成认证信息(见:05 Nginx网站服务.pdf)。
此处演示在线生成:http://www.jsons.cn/htpasswd
假设 two 网站需要认证后才可进入
把刚才的认证信息保存到文件中,如:
修改 two 网站的配置
- w :表示开启这个功能,"two.my.com"是备注信息,可以随便写,一些老浏览器能看到,新浏览器都看不到备注信息了。
- auth_basic_user_file :指定认证信息所保存的文件
重启 nginx服务后,访问
7.https 和 ssl
http属于明文传输数据,https是加密传输,也是现在的主流方式,需要ssl认证并进行相关配置。
-
配置前提:安装 nginx时需要添加ssl模块 --with-http_ssl_module
-
ssl证书:可以在网站提供商处下载免费证书(如阿里云),也可以通过 openssl 生成(仅限实验)
从阿里云下载的证书如下,解压后有 key 和 pem 两个文件
此处演示 openssl 生成过程
# 生成密钥
openssl genrsa -out my.com.key 1024
# 生成证书并签字
openssl req -new -key my.com.key -out my.com.csr
openssl x509 -req -days 365 -sha256 -in my.com.csr -signkey my.com.key -out my.com.crt
此时生成的文件
nginx配置文件说明
修改配置
listen 443 ssl;
ssl_certificate /usr/local/nginx/cert/my.com.crt;
ssl_certificate_key /usr/local/nginx/cert/my.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5";
ssl_prefer_server_ciphers on;
firewall允许https服务或放开443端口
重启nginx服务,测试网站: https://www.my.com 或者 https://www.my.com:443
如果此时访问 http://www.my.com 不会自动跳转 到 https,需要配置重定向
# 只配置 rewrite 即可 ,root 和 index 可以不用配置
rewrite ^/(.*)$ https://www.my.com:443/$1 permanent;
重启nginx服务,测试网站
http://www.my.com/ 会自动跳转至 https://www.my.com/
8.rewrite 和 return
rewrite
其他
不带 www 也可以访问
9.目录浏览
类似网站:https://cmake.org/files/
注:设置了目录浏览功能的网站,不能有 index.html 页面
10.访问控制
多个的话,也可以用网段 192.168.1.0/24
出现 403 forbidden 的可能:
11.location和优先级
注意:后面的 / 是多余的,如: ~* /a+
12.反向代理、负载均衡
负载均衡
步骤1.再准备一台虚拟机,配置好apache和测试页
注:此实验需要2台apache服务器、1台nginx服务器。
apache服务器上的网页应该是一致的,但为了测试效果,故意改为不同。
步骤2.修改nginx配置文件
步骤3.重启nginx服务,测试页面访问
结果:刷新页面,间隔显示2台apache的页面
补充(实验过程略):