Nginx

什么是Nginx

Nginx 是一个高性能的 http 和反向代理服务器,其特点是占用内存小,并发能力强。 Nginx 专为性能优化而开发,性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。

Nginx可以从事的用途

web服务器

提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。

反向代理

正向代理:在浏览器中配置代理服务器,通过代理服务器进行互联网访问。
反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器地址。

负载均衡

如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。

Nginx安装

CentOS

yum install -y nginx

Ubuntu

apt-get install -y nginx

当终端显示出Complete!字样时,则代表我们的Nginx已经安装成功了。

Docker 方式安装: Docker 部署 Nginx - 简书 (jianshu.com)

查看Nginx版本:

nginx -v

Nginx自带常用命令

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t           不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v           显示 nginx 的版本。
nginx -V           显示 nginx 的版本,编译器版本和配置参数。

Nginx启动

##在centos7+ 启动nginx服务
systemctl start nginx
#centos6+ 上启动nginx服务
service nginx start
#或,简单粗暴一句,通过这种方式启动nginx 使用systemctl status nginx查看的状态是未运行
nginx

Nginx停止

##在centos7+ 停止nginx服务
systemctl stop nginx
#centos6+ 上停止nginx服务
service nginx stop
#粗鲁的停止,下班了,不干了,就算请求来了我也不接了。
nginx -s stop
##优雅的停止,Nginx在退出前完成已经接受的连接请求。
nginx -s quit

Nginx重启

##在centos7+ 重启nginx服务
systemctl restart nginx
#centos6+ 上重启nginx服务
service nginx restart
#使用nginx命令停止,推荐这个
nginx -s reload

四种解决Nginx出现403 forbidden 报错的方法

一、由于启动用户和nginx工作用户不一致所致

1.1查看nginx的启动用户

ps aux | grep "nginx: worker process" | awk '{print $1}'

1.2将nginx.config的user改为和启动用户一致

vim conf/nginx.conf
二、缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件
  server {
    listen       80;
    server_name localhost;
    index index.php index.html;
    root /data/www/;
  }

如果在/data/www/下面没有index.php,index.html文件的时候,直接会报403 forbidden

三、权限问题,如果nginx没有web目录的操作权限,也会出现403错误

解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决

chmod -R 777 /data
chmod -R 777 /data/www/
四、SELinux设置为开启状态(enabled)的原因

查看当前selinux的状态

/usr/sbin/sestatus

将SELINUX=enforcing 修改为 SELINUX=disabled 状态

vim /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled

重启生效。reboot

reboot

SELinux作为Linux的安全防护插件,在普通机器和其他生产环境有额外的系统做安全防护,所以这里关闭即可

配置web服务器

location /path/ {
    # 相对匹配,文件路径等于 root + location,如访问 http://ip/path/ 对应的文件目录是/root/software/autotpsite/dist/path/
 root   /root/software/autotpsite/dist;  
    # 绝对匹配,文件路径等于alias对应目录与location无关, 目录必须以/结尾 与root二选一 ,如访问 http://ip/path/ 对应的文件目录 /root/software/autotpsite/dist/
 # alias   /root/software/autotpsite/dist/; 
}

正向代理和反向代理介绍

正向代理:

正向代理服务是由客户端设立的。
客户端了解代理服务器和目标服务器都是谁。
帮助咱们实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的ip地址。


image.png
反向代理:

反向代理服务器是配置在服务端的。
客户端是不知道访问的到底是哪一台服务器。
达到负载均衡,并且可以隐藏服务器真正的ip地址。


image.png

部署反向代理

反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址

核心配置:

### 省略了http和server块,这里加到server块里面就可以
location /api/ {
   include       uwsgi_params;
   uwsgi_pass     127.0.0.1:8081; # 此方式需要 uwsgi采用socket连接方式
}
#location /jira {
#   include       uwsgi_params;
#   uwsgi_pass     127.0.0.1:8081;
#}
location / {
   alias     /root/software/autotpsite/dist/;
}

或者使用正则的方式匹配URL

location / {
   alias     /root/software/autotpsite/dist/;
}
location ~/(api/|jira/) {
   include       uwsgi_params;
   uwsgi_pass     127.0.0.1:8081;
 # proxy_pass   http://127.0.0.1:8081;   # 通用配置方式
}

uWSGI服务配置

[uwsgi]
# 配置文件处于项目根目录,因此设置为相对路径即可,复用性更高
chdir = ./              
module = autotpsite.wsgi:application
# Nginx使用uwsgi_pass做方向代理时 需要设置成socket
socket = 0.0.0.0:8081
#http-socket = 0.0.0.0:8081   #对应nginx的uwsgi模式
#http = 0.0.0.0:8081     #对应nginx的uwsgi模式
master = true
pidfile = uwsgi8081.pid
daemonize = uwsgi_server.log
# 只记录错误信息
disable-logging = true
# 新增配置--允许多线程
enable-threads = true
# 设置请求头最大字节数,用于socket模式
buffer-size = 40960

location指令说明:
功能:用于匹配URL
语法如下:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

部署负载均衡

在nginx中配置负载均衡也是十分容易的,同时还支持了多种负载均衡策略供我们灵活选择。

http {
###此处省略一大堆没有改的配置
   ##自定义我们的服务列表
   upstream myserver{
       server 127.0.0.1:8081;
       server 192.168.2.5:8081;
   }
   server {
       listen       80 ; ##设置我们nginx监听端口为8888
       server_name myserve;
       # Load configuration files for the default server block.
       include /etc/nginx/default.d/*.conf;
       location / {
           alias   /root/software/autotpsite/dist/;
       }
       location ~/(api/|jira/) {
           proxy_pass   http://myserver; # 核心配置在这里
           proxy_connect_timeout 10;   # 超时时间,单位秒
       }
       error_page 404 /404.html;
           location = /40x.html {
       }
       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }
}

uWSGI配置:

[uwsgi]
chdir = /root/software/autotpsite/
module = autotpsite.wsgi:application
http-socket = 0.0.0.0:8081
master = true
pidfile = /root/software/autotpsite/uwsgi8081.pid
daemonize = /root/software/autotpsite/uwsgi_server.log
# 只记录错误信息
disable-logging = true

nginx提供了三种不同的负载均衡策略供我们灵活选择,分别是:

轮询(默认方式):

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
用法:啥也不加,上文实例就是默认的方式,就是默认的

权重(weight):

weight 代表权重,默认为 1,权重越高被分配的客户端越多,权重越大,能力越大,责任越大,处理的请求就越多。
用法:

upstream myserver{
   server 127.0.0.1:8081 weight =1;
   server 192.168.2.5:8081 weight=2;
}
ip_hash:

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
用法:

 upstream myserver{
       ip_hash;#可与weight配合使用
       server 127.0.0.1:8081 weight =1;
       server 192.168.2.5:8081 weight =2;
     }
image.png

Nginx动静分离

Nginx的并发能力公式:
worker_processes * worker_connections / 4 | 2 = Nginx最终的并发能力
动态资源需要/4,静态资源需要/2.
Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应。

image.png

上图是动态资源的请求工程 四个连接数 ,咱们把静态资源放在nginx 上面 就只需要两个连接数, 同时也减轻了后面服务器的压力 , 如下图 静态资源直接放在nginx

image.png
动态资源代理

使用proxy_pass动态代理

# 配置如下
location / {
  proxy_pass 路径;
}
静态资源代理

为了验证效果,把应用中的静态资源都拷贝到 /opt/docker_nginx/statics/ 目录下
这个目录通过数据卷映射到了nginx内部的 /usr/share/nginx/statics 目录
我们通过location 指定了特性类型的静态资源访问这个路径。

所以,本质上静态资源会到 /opt/docker_nginx/statics/ 目录加载。
我们把要验证的静态资源,比如汤姆猫图片,美女图片【命名为tomcat.png】,放到这个目录。

image.png

配置文件:

# 修改配置文件
upstream emp {
  ip_hash;
  server 192.168.174.128:8081;
  server 192.168.174.128:8080;
}

server{
    listen 80;
    server_name localhost;
    
    location ~* \.(gif|jpg|png|js|css|html)$ {
        # 匹配以gif|jpg|png|js|css|html为结尾的路径 静态资源
        root /usr/share/nginx/statics;
    }
    
    location / {
        proxy_pass http://emp/;
    }

}

vim docker-compose.yml

version: '3.1'
services:
  nginx:
    restart: always
    image: daocloud.io/library/nginx:latest
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
      - /opt/docker_nginx/statics/:/usr/share/nginx/statics

我们当前的所有静态资源文件,比如js/css/images/html都放在了 /opt/docker_nginx/statics 目录下如果遇到访问静态资源403无权限查看的问题,原因是nginx访问时是通过nginx用户,而statics 静态文件夹是root用户创建的,其他用户没有访问权限,需要添加访问权限

chmod -R 777 /opt/docker_nginx/statics/

动态资源从tomcat获取,静态资源从/opt/docker_nginx/statics/目录获取 ==> Nginx动静分离

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容