Nginx适用于单体项目,分布式项目能显示出他的强大。
正、反代理
正向代理和反向代理最主要的区别在于 中间代理者是否可以帮我选择要连接哪台服务,这就是nginx的反向代理。
安装Nginx
我的是ubuntu镜像下
apt-get install nginx
安装gcc环境
apt-get install gcc g++
centOs下是:yum install gcc gcc-c++
安装openssl,就是https
sudo apt-get install openssl libssl-dev
安装pcre,用于解析正则表达式
sudo apt-get install libpcre3 libpcre3-dev
安装zlib,压缩和解压缩依赖
sudo apt-get install zlib1g-dev
Nginx里有两个进程
查看Nginx的进程
ps -ef|grep nginx
master进程:主进程
worker进程:工作进程,worker进程的数量可以进行修改(默认1)
在nginx的config配置文件最上方配置一下就可以了
worker_processes: 2;
修改配置文件是需要重启nginx,这样才会生效新的配置文件
master进程就是接收到来自操作人的指令,然后在将这些指令分发给不同的worker,不同的worker对应不同的client。如果当下发重启指令时,有woker进行正在跟client进行响应通讯,那么该worker不会立即重启,会等跟client处理完毕之后再进行重启,空闲的worker就会立即重启。
Nginx处理Web请求机制
Worker抢占机制
当有多个worker的时候,一个client过来请求时,会有一个互斥锁(accept_mutex),这些worker会争抢这把互斥锁,抢到的worker会和这个client进行连接,完成响应。
Nginx事件处理
当只有一个worker时,有一个client1请求过来造成了阻塞,这时候有client2,client3请求过来,这个worker也会同时去处理client2,client3这两个请求,因为nginx本身是异步非阻塞的(AIO),这是对于nginx可以进行设置的,在linux上使用的是epoll事件机制,对于不同的镜像有不同的工作模式。
传统的服务器事件处理就是同步阻塞的机制(BIO),处理效率就非常低下。
具体是可以配置nginx最大连接数(并发数),默认是1024,实际要根据服务器的cpu去进行配置,如果太高了cpu就负载了。
events {
# 默认是使用epoll
user epoll;
# 每个worker运行连接的客户端最大连接数
worker_connections: 1024;
}
为什么Nginx的并发这么高 总结:
1.他的worker抢占机制
2.他自身就是一个异步非阻塞的
配置文件
文件结构:
可以将worker的权限赋为root,在配置文件中如下:
user root;
nginx的日志级别:
debug 、info、notice、warn、error、crit
级别依次提高
nginx中有一个access.log,这是用来记录请求记录的日志,这里面他是有一个格式输出的,client的ip
+时间+请求类型+协议+返回状态等,还包括是什么浏览器,从哪个网站跳转过来的信息。
sendfile默认是打开的,这是一个文件高效传输的,提升文件传输的性能
tcp_nopush当数据包累积到一定大小的时候再发送,提升文件传输的效率
sendfile on;
tcp_nopush on;
keepalive_timeout单位是s,保持打开状态的时间,这样server可以用这段时间去处理一些事情,就并不用再去建立一个新的连接去消耗资源(默认0)。
keepalive_timeout 0;
gzip 压缩,默认打开,可以减少带宽,但是CPU会消耗
gzip on;
gzip_min_length 1; #限制最小压缩,小于1字节文件不会压缩
gzip_comp_level 3; #压缩比范围 1-9,文件越大压缩越多,CPU使用越多
gzip_types: text/plain application/javascript image/jpeg;#定义压缩文件类型
server 就是配置虚拟主机的内容,就是监听服务器上的某个端口,某个文件映射成自己配置的一个地址
server{
listen 80;
server_name XXX;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:port;
}
}
除了在config里配置,还可以利用include来配置
在nginx的配置文件里写上下面的这一句配置(效果其实就是代替了上面的server{})
include cxqnb.conf;
cxqnb.conf里就是把这个server{}配置抽离了出来
server{
listen 80;
server_name XXX;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:port;
}
}
常用命令
nginx -s reload #重启nginx
sudo systemctl start nginx #启动Nginx
sudo systemctl enable nginx #开机自动启动Nginx服务
sudo systemctl disable nginx #关闭开机自动启动Nginx服务
sudo nginx -t #测试Nginx是否启动成功,这个也是可以查看每次修改完配置是否正确
Nginx配置静态资源
比如:
同一个程序下配置一套静态资源就是增加一个location,location后的路由不能配置相同,localtion后的 内容是会拼接到root后面的地址,比如 /image 就是会匹配 /home/image这个地址
还有一个方式就是使用别名(alias),alias后面配置就是图片的路径,这样访问的时候就是直接用/static访问资源了
server{
listen 80;
server_name XXX;
location / {
root /home/food;
index index.html;
}
location /image {
root /home;
}
location /static {
alias /home/image;
}
}
location的匹配
location 后面加了 = 就是精准匹配,比如location = /image/logo.png,这样就只能在浏览器里访问这种图片,如果改成其他的名字就会访问不到
server{
listen 80;
server_name XXX;
location / {
root /home/food;
index index.html;
}
location = /image/logo.png {
root /home;
}
}
正则表达式**~** , *****表示不区分大小写,下面的这个例子就是他会去/home下一层层去找这些符合后缀的图片,如果去掉*就是精准查找
server{
listen 80;
server_name XXX;
location ~*\.(GIF|PNG|JPEG) {
root /home;
}
}
**^~**表示以某个字符路径开头请求
server{
listen 80;
server_name XXX;
location ^~/image {
root /home;
}
}
记录:
Nginx执行任务,日志分割(开启定时任务)