Nginx 学习笔记
https://www.jianshu.com/p/65892355cad5
nginx配置多个服务器很简单,复制 server, 修改ip,端口,和项目部署路径即可
nginx 配置文件安装的 软件库
gcc、 openssl-devel、 pcre-devel和zlib-devel
1 安装命令,注意 –with-http_stub_status_module 启动了
Nginx 的 NginxStatus,用来监控状态
wget http://nginx.org/download/nginx-1.0.14.tar.gz
tar zxvf nginx-1.0.14.tar.gz
./configure --with-http_stub_status_module --prefix=/opt/nginx
cd nginx-1.0.14
make
2 配置的结构
main,主配置影响所有
event
http
server 指定主机端口
location 位置
upstream 负载均衡
3 模块
Nginx的主模块指令、
事件模块指令、
HTTP核心模块指令,
Http SSL模块、
HttpGzip Static模块
Http Addition模块
4 真实配置
user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65536;
不用说都是主模块指令
user 主模块指令, 用户和用户组, nobody用户
worker_processes , 进程数消耗10m内次
和cup数量相同
nobody linux 创建时自带的 用户名,没有特权,谁都能用
error_log 错误日志,就不重复了,6大级别,debug最多
debug、info、notice、warn、error、crit
worker_rlimit_nofile 绑定workder进程和cpu???,没用处???
pid 指定pid存放的位置,解释下pid,只记录主进程号,
刚创建nginx没有,启动后自动保存,目录是默认,可用修改就在这里
他的用处除了 用kill -9杀死nginx,还可以通过pid
杀死进程
/data/logs/nginx.pid kill –QUIT `cat /data/logs/nginx.pid`,没试过
剩下的events 工作模式和 一个进程连接上限
use 事件模型指令, linux首选是epoll(这个最重要),标准的是select poll,
kqueue用在bsd上 ,共有 select、poll、kqueue、epoll、rtsig和/dev/poll
worker_connections 默认1024,可设置65536,
实际连接数 max_client最大是 =进程数乘以 单进程连接数,如反向代理则除以四
这个参数受到 liuxn 最大打开file的限制,执行ulimit -n65536就好了
好博客地址:
https://blog.csdn.net/wangbin_0729/article/details/82109693
BSD 系统伯克利系统,说白了就是unix 5 http的属性说明 http{ include conf/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; client_max_body_size 20m; client_header_buffer_size 32K; large_client_header_buffers 4 32k; Sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; client_header_timeout 10; client_body_timeout 10; 解释一下 一堆超时和 文件大小的设置,都不用改 include 引入其他文件,难道可以是其他 .conf??,的确如此例如是 * include /usr/local/nginx/conf/vhost/*;,里面配置了 server{xxxx} default_type 默认二进制流 下面两个超长的 是日志的配置和解释 log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。 client_max_body_size 一个人访问 body大小 client_header_buffer_size 指定header大小 用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K; large_client_header_buffers 用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K; sendfile 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞; keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接; client_header_timeout 设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误; client_body_timeout 设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60; send_timeout 指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。 7 gzip说的太好不用再解释了,先查装了模块没,用力在线实时压缩流 HttpGzip模块配置 下面配置Nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。 看是否安装了HttpGzip模块: [root@vps ~]# /opt/nginx/sbin/nginx -V nginx version: nginx/1.0.14 built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx 通过/opt/nginx/sbin/nginx -V命令可以查看安装Nginx时的编译选项,由输出可知,我们已经安装了HttpGzip模块。 下面是HttpGzip模块在Nginx配置中的相关属性设置: gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; gzip用于设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流; gzip_min_length设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大; gzip_buffers表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果; gzip_http_version用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可; gzip_comp_level用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源; gzip_types用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的; gzip_vary选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。 然后负载均衡,虚拟主机和location的配置说明 负载均衡配置 下面设定负载均衡的服务器列表: 1 2 3 4 5 6 7 upstream cszhi.com{ ip_hash; server 192.168.8.11:80; server 192.168.8.12:80 down; server 192.168.8.13:8009 max_fails=3 fail_timeout=20s; server 192.168.8.146:8080; } upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。 在上面的设定中,通过upstream指令指定了一个负载均衡器的名称cszhi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。 Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响; Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下; ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题; fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块; url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。 在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有: down:表示当前的server暂时不参与负载均衡; backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻; max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误; fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。 注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。 2.5 server虚拟主机配置 下面介绍对虚拟主机的配置。 建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。 1 2 3 4 5 6 7 server{ listen 80; server_name 192.168.8.18 cszhi.com; index index.html index.htm index.php; root /wwwroot/www.cszhi.com charset gb2312; access_log logs/www.ixdba.net.access.log main; server标志定义虚拟主机开始,listen用于指定虚拟主机的服务端口,server_name用来指定IP地址或者域名,多个域名之间用空格分 开。index用于设定访问的默认首页地址,root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。Charset用于 设置网页的默认编码格式。access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。 2.6 location URL匹配配置 URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。使用location URL匹配配置还可以实现反向代理,用于实现PHP动态解析或者负载负载均衡。 以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。 1 2 3 4 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /wwwroot/www.cszhi.com; expires 30d; } 以下这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.cszhi.com目录中。 1 2 3 4 location ~ ^/(upload|html)/ { root /web/wwwroot/www.cszhi.com; expires 30d; } 在最后这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。 1 2 3 4 location ~ .*.php$ { index index.php; proxy_pass http://localhost:8080; } 2.7 StubStatus模块配置 StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用此功能。 以下指令实指定启用获取Nginx工作状态的功能。 1 2 3 4 5 6 location /NginxStatus { stub_status on; access_log logs/NginxStatus.log; auth_basic "NginxStatus"; auth_basic_user_file ../htpasswd; } stub_status设置为“on”表示启用StubStatus的工作状态统计功能。access_log 用来指定StubStatus模块的访问日志文件。auth_basic是Nginx的一种认证机制。auth_basic_user_file用来指定认证的密码文件,由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件,例如要添加一个test用户,可以使用下面方式生成密码文件: /usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd test 然后输入两次密码后确认之后添加用户成功。 要查看Nginx的运行状态,可以输入http://ip/NginxStatus,输入创建的用户名和密码就可以看到Nginx的运行状态: Active connections: 1 server accepts handled requests 34561 35731 354399 Reading: 0 Writing: 3 Waiting: 0 Active connections表示当前活跃的连接数,第三行的三个数字表示 Nginx当前总共处理了34561个连接, 成功创建次握手, 总共处理了354399个请求。最后一行的Reading表示Nginx读取到客户端Header信息数, Writing表示Nginx返回给客户端的Header信息数 ,“Waiting”表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。 在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过512K,否者会被ie浏览器替换为ie默认的错误页面。 1 2 3 4 5 6 7 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
gzip 牛逼的地方在于压缩后html,js,css变为原来的1/3
Nginx开启Gzip压缩功能, 可以使网站的css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能! Web网站上的图片,视频等其它多媒体文件以及大文件,因为压缩效果不好,所以对于图片没有必要支压缩,如果想要优化,可以图片的生命周期设置长一点,让客户端来缓存。 开启Gzip功能后,Nginx服务器会根据配置的策略对发送的内容, 如css、js、xml、html等静态资源进行压缩, 使得这些内容大小减少,在用户接收到返回内容之前对其进行处理,以压缩后的数据展现给客户。这样不仅可以节约大量的出口带宽,提高传输效率,还能提升用户快的感知体验, 一举两得; 尽管会消耗一定的cpu资源,但是为了给用户更好的体验还是值得的。
经过Gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会快得多。Gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析。浏览器那里不需要我们担心,因为目前的巨大多数浏览器 都支持解析Gzip过的页面。
这里有nginx配置公钥私钥 https的 说明
https://www.cnblogs.com/cy-8593/p/10021296.html
其中
server 就是虚拟主机的意思
root 是指定项目的根目录,适用与server和location。可以指定多个,如果locaiton没有指定,会往其外层的server或http中寻找继承,
nginx中root指令的地址,其实是替换了匹配后的url中的host。
nginx https
12. Nginx配置SSL(https 访问)
12.1. SSL工作流程
- 浏览器发送一个https的请求给服务器;
- 服务器要有一套数字证书,可以自己制作(后面的操作会具体介绍),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书,则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
- 服务器会把公钥传输给客户端;
- 客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
- 客户端把加密后的随机字符串传输给服务器;
- 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
- 服务器把加密后的数据传输给客户端;
- 客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
12.2 SSL 工作示意图
12.3. 生成SSL密钥对
- 进入“conf”目录
cd /usr/local/nginx/conf
- 创建私钥
openssl genrsa -des3 -out tmp.key 2048
//key文件为私钥 - 转换key,取消密码
openssl rsa -in tmp.key -out admin.key
//转换key,取消密码rm -f tmp.key
- 生成证书请求文件
openssl req -new -key admin.key -out admin.csr
//生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件 - 生成公钥文件
openssl x509 -req -days 365 -in admin.csr -signkey admin.key -out admin.crt
// 这里的admin.crt为公钥
12.4. Nginx配置 SSL
- 编辑配置:
vim /usr/local/nginx/conf/vhost/ssl.conf
//加入如下内容
server
{
listen 443;
server_name admin.com;
index index.html index.php;
root /data/wwwroot/admin.com;
ssl on;
ssl_certificate admin.crt;
ssl_certificate_key admin.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
- 检查&加载配置
-t && -s reload
//若报错unknown directive “ssl” ,需要重新编译nginx,加上“--with-http_ssl_module” - 创建目录、网页:
mkdir /data/wwwroot/aming.com
echo “ssl test page.”>/data/wwwroot/admin.com/index.html
- Windows测试网页:
编辑hosts,增加127.0.0.1 admin.com
浏览器访问: https://admin.com/