赞
踩
解决 nginx 部署前端post请求405 not allowed。nginx 静态资源访问不支持post请求。
location / {
root /usr/local/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
error_page 405 =200 @405; #405页面处理
}
#加入下面代码
location @405 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#ip为后端服务地址
proxy_pass http://192.168.3.129:8081$request_uri;
}
Nginx 是一款轻量级的 HTTP 服务器 ( 或叫 web服务器 ),采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的 反向代理 和 负载均衡。Nginx 是由俄罗斯人 伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,并于2004年首次公开发布的。
Nginx 特点:
web服务器:负责处理和响应用户请求,一般也称为http服务器,如 Apache、IIS、Nginx
应用服务器:存放和运行系统程序的服务器,负责处理程序中的业务逻辑,如 Tomcat、Weblogic、Jboss(现在大多数应用服务器也包含了web服务器的功能)
Nginx 是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。在Nginx网站上,其功能包括:
IO多路复用 epoll(IO复用)
如何理解呢?举个例子吧!
- 有A、B、C三个老师,他们都遇到一个难题,要帮助一个班级的学生解决课堂作业。
- 老师A采用从第一排开始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了很多时间,并且有的学生作业还没有完成呢,老师就来了,反反复复效率极慢。
- 老师B是一个忍者,他发现老师A的方法行不通,于是他使用了影分身术,分身出好几个自己同一时间去帮好几个同学回答问题,最后还没回答完,老师B消耗光了能量累倒了。
- 老师C比较精明,他告诉学生,谁完成了作业举手,有举手的同学他才去指导问题,他让学生主动发声,分开了“并发”。
这个老师C就是Nginx。
轻量级
功能模块少 - Nginx仅保留了HTTP需要的模块,其他都用插件的方式,后天添加
代码模块化 - 更适合二次开发,如阿里巴巴Tengine
CPU 亲和
把CPU核心和Nginx工作进程绑定,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而提高性能。
nginx # 启动 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 -v # 显示 nginx 的版本
nginx -V # 显示 nginx 的版本,编译器版本和配置参数
pkill -9 nginx # 强制停止 Nginx
# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua
英文文档:http://nginx.org/en/docs/
中文文档:https://blog.redis.com.cn/doc/学习nginx配置,这一篇就够了:https://zhuanlan.zhihu.com/p/355440492
Nginx 配置详解:https://www.runoob.com/w3cnote/nginx-setup-intro.html
经常要用到的几个文件路径:
/usr/local/etc/nginx/nginx.conf (nginx配置文件路径)
/usr/local/var/www (nginx服务器默认的根目录)
/usr/local/Cellar/nginx/1.17.9 (nginx的安装路径)
/usr/local/var/log/nginx/error.log (nginx默认的日志路径)
nginx.conf 是典型的分段配置文件。在http 区域内,配置无数个 server ,每一个 server 对应着一个虚拟主机(站点)或者域名。server{ } 是包含在 http{ } 内部的。
- http {
- ... ... #后面再详细介绍 http 配置项目
-
- # 当 nginx 接到请求后,会匹配其配置中的 server 区域段
- # 匹配方法就是将请求携带的host和port去跟配置中的server_name和listen相匹配
- server {
- listen 80 # 监听端口;
- server_name localhost # 地址。定义当前虚拟主机(站点)匹配请求的主机名
-
- location / { # 访问首页路径
- root /xxx/xxx/index.html # 默认目录
- index index.html index.htm # 请求时返回的默认文件。先找根目录下的index.html,如果没有再找index.htm
- }
-
- error_page 500 504 /50x.html #当出现以上状态码时从新定义到50x.html
- location = /50x.html { #当访问50x.html时
- root /xxx/xxx/html #50x.html 页面所在位置
- }
- }
-
- server {
- ... ...
- }
- }
http 区域段 的配置
- http {
- sendfile on #高效传输文件的模式 一定要开启
- keepalive_timeout 65 #客户端服务端请求超时时间
- log_format main XXX #定义日志格式 代号为main
- access_log /usr/local/access.log main #日志保存地址 格式代码 main
- }
下面是 nginx 一些配置中常用的内置全局变量,你可以在配置的任何位置使用它们。
打开默认配置文件:vim /usr/local/nginx/conf/nginx.conf
Nginx 配置参数中文详细说明
- #定义Nginx运行的用户和用户组
- user www www;
- #
- #nginx进程数,建议设置为等于CPU总核心数.
- worker_processes 8;
- #
- #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
- error_log /var/log/nginx/error.log info;
- #
- #进程文件
- pid /var/run/nginx.pid;
- #
- #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
- worker_rlimit_nofile 65535;
- #
- #工作模式与连接数上限
- events
- {
- #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
- use epoll;
- #单个进程最大连接数(最大连接数=连接数*进程数)
- worker_connections 65535;
- }
- #
- #设定http服务器
- http
- {
- include mime.types; #文件扩展名与文件类型映射表
- default_type application/octet-stream; #默认文件类型
- #charset utf-8; #默认编码
- server_names_hash_bucket_size 128; #服务器名字的hash表大小
- client_header_buffer_size 32k; #上传文件大小限制
- large_client_header_buffers 4 64k; #设定请求缓
- client_max_body_size 8m; #设定请求缓
-
- # 开启目录列表访问,合适下载服务器,默认关闭.
- autoindex on; # 显示目录
- autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
- autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间
-
- sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
- tcp_nopush on; # 防止网络阻塞
- tcp_nodelay on; # 防止网络阻塞
-
- keepalive_timeout 120; # (单位s)设置客户端连接保持活动的超时时间,在超过这个时间后服务器会关闭该链接
-
- # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
- fastcgi_connect_timeout 300;
- fastcgi_send_timeout 300;
- fastcgi_read_timeout 300;
- fastcgi_buffer_size 64k;
- fastcgi_buffers 4 64k;
- fastcgi_busy_buffers_size 128k;
- fastcgi_temp_file_write_size 128k;
-
- # gzip模块设置
- gzip on; #开启gzip压缩输出
- gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
- gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
- gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
- gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
- gzip_types text/plain application/x-javascript text/css application/xml;
- #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
- gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据
-
- #开启限制IP连接数的时候需要使用
- #limit_zone crawler $binary_remote_addr 10m;
-
- ##upstream的负载均衡,四种调度算法(下例主讲)##
-
- #虚拟主机的配置
- server
- {
- # 监听端口
- listen 80;
- # 域名可以有多个,用空格隔开
- server_name ably.com;
- # HTTP 自动跳转 HTTPS
- rewrite ^(.*) https://$server_name$1 permanent;
- }
-
- server
- {
- # 监听端口 HTTPS
- listen 443 ssl;
- server_name ably.com;
-
- # 配置域名证书
- ssl_certificate C:\WebServer\Certs\certificate.crt;
- ssl_certificate_key C:\WebServer\Certs\private.key;
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 5m;
- ssl_protocols SSLv2 SSLv3 TLSv1;
- ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
- ssl_prefer_server_ciphers on;
-
- index index.html index.htm index.php;
- root /data/www/;
- location ~ .*\.(php|php5)?$
- {
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fastcgi.conf;
- }
-
- # 配置地址拦截转发,解决跨域验证问题
- location /oauth/ {
- proxy_pass https://localhost:13580/oauth/;
- proxy_set_header HOST $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
-
- # 图片缓存时间设置
- location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
- expires 10d;
- }
-
- # JS和CSS缓存时间设置
- location ~ .*\.(js|css)?$ {
- expires 1h;
- }
-
- # 日志格式设定
- log_format access '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" $http_x_forwarded_for';
- # 定义本虚拟主机的访问日志
- access_log /var/log/nginx/access.log access;
-
- # 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
- location /NginxStatus {
- stub_status on;
- access_log on;
- auth_basic "NginxStatus";
- auth_basic_user_file conf/htpasswd;
- #htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
- }
- }
- }
配置文件语法格式
配置文件由注释行,指令块配置项和一系列指令配置项组成。每一条指令由配置项名称和值参数组成,值参数可以是一个或多个附加参数,取决于解析该条指令的模块。
当然 nginx 的配置非常多,用的时候可以根据文档进行配置。
nginx.conf 是典型的分段配置文件
- #user nobody;
- worker_processes auto;
-
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
-
- #pid logs/nginx.pid;
-
- events {
- worker_connections 1024;
- }
-
- http {
- include mime.types;
- default_type application/octet-stream;
-
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
-
- #access_log logs/access.log main;
-
- sendfile on;
- #tcp_nopush on;
-
- #keepalive_timeout 0;
- keepalive_timeout 65;
-
- #gzip on;
- autoindex on; # 显示目录
- autoindex_exact_size on; # 显示文件大小
- autoindex_localtime on; # 显示文件时间
-
- server {
- listen 80;
- server_name www.myself_1.com laowang.com www.myself_2.com;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html;
- index index.html index.htm;
- try_files $uri $uri/ /index.html;
- }
- #error_page 404 /404.html;
- # redirect server error pages to the static page /50x.html
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
-
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1;
- #}
-
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
-
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #}
- }
-
-
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
-
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
-
-
- # HTTPS server
-
- server {
- listen 443 ssl;
- server_name www.myself_1.com laowang.com www.myself_2.com;
-
- ssl_certificate /usr/local/nginx/cert/laowang.com.pem;
- ssl_certificate_key /usr/local/nginx/cert/laowang.com.key;
-
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 5m;
-
- ssl_ciphers HIGH:!aNULL:!MD5;
- ssl_prefer_server_ciphers on;
-
- location / {
- root html;
- index index.html index.htm;
- }
- location /upload_file {
- alias /data/upload/;
- }
-
- location /upload_file_test {
- alias /data/upload_test/;
- }
-
- location /img {
- proxy_pass http://myself_domain:8888/img;
- }
-
- location /alias_test {
- alias /data/alias_test;
- }
-
- location /forward_server {
- proxy_pass http://10.10.10.10:9010/;
- }
-
- location /algc {
- proxy_pass http://10.10.10.20:9020/algc;
- }
-
- location /llma {
- proxy_pass http://10.10.10.20:9020/llma;
- }
- }
-
- server {
- listen 8500;
- server_name www.myself_1.com laowang.com www.myself_2.com;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root /data/web/;
- index index.html index.htm;
- try_files $uri $uri/ /index.html;
- }
- location /prd-api {
- proxy_pass https://www.myself.com:8888/;
- proxy_buffering off;
- }
- location /dev-api {
- proxy_pass https://www.myself.com:7777/;
- proxy_buffering off;
- }
- }
-
- server {
- listen 8600;
- server_name www.myself_1.com laowang.com www.myself_2.com;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root /data/test/web;
- index index.html index.htm;
- try_files $uri $uri/ /index.html;
- }
- location /prd-api/ {
- proxy_pass http://laowang.com:6666/;
- }
- }
-
- server {
- listen 8700;
- server_name www.myself_1.com laowang.com www.myself_2.com;
- location /glm {
- proxy_pass http://10.10.10.30:9530/;
- }
-
- location /cs-glm {
- proxy_pass http://10.10.10.40:9540/;
- }
-
- location /tts/ {
- proxy_pass http://10.10.10.50:9550/;
- }
- }
- }
Nginx 安装目录下, 我们复制一份`nginx.conf`成
`nginx.conf.default`
作为配置文件备份,然后修改`nginx.conf`
- # 工作进程的数量
- worker_processes 1;
- events {
- worker_connections 1024; # 每个工作进程连接数
- }
-
- http {
- include mime.types;
- default_type application/octet-stream;
-
- # 日志格式
- log_format access '$remote_addr - $remote_user [$time_local] $host "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for" "$clientip"';
- access_log /srv/log/nginx/access.log access; # 日志输出目录
- gzip on;
- sendfile on;
-
- # 链接超时时间,自动断开
- keepalive_timeout 60;
-
- # 虚拟主机
- server {
- listen 8080;
- server_name localhost; # 浏览器访问域名
-
- charset utf-8;
- access_log logs/localhost.access.log access;
-
- # 路由
- location / {
- root www; # 访问根目录
- index index.html index.htm; # 入口文件
- }
- }
-
- # 引入其他的配置文件
- include servers/*;
- }
# 引入其他的配置文件
include servers/*;
在其他配置文件`servers`目录下,添加新建站点配置文件 xx.conf。电脑 hosts 文件添加 127.0.0.1 xx_domian
- # 虚拟主机
- server {
- listen 8080;
- server_name xx_domian; # 浏览器访问域名
-
- charset utf-8;
- access_log logs/xx_domian.access.log access;
-
- # 路由
- location / {
- root www; # 访问根目录
- index index.html index.htm; # 入口文件
- }
- }
执行命令 nginx -s reload,成功后浏览器访问 xx_domian 就能看到你的页面
- location ~.*\.css$ {
- expires 1d;
- break;
- }
- location ~.*\.js$ {
- expires 1d;
- break;
- }
-
- location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
- access_log off;
- expires 15d; #保存15天
- break;
- }
-
- #测试图片的max-age
- # curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I
开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果。这是我们可以禁止浏览器缓存提高效率
- location ~* \.(js|css|png|jpg|gif)$ {
- add_header Cache-Control no-store;
- }
可以防止文件被其他网站调用
- location ~* \.(gif|jpg|png)$ {
- # 只允许 192.168.0.1 请求资源
- valid_referers none blocked 192.168.0.1;
- if ($invalid_referer) {
- rewrite ^/ http://$host/logo.png;
- }
- }
- server {
- # 开启gzip 压缩
- gzip on;
- # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)
- gzip_http_version 1.1;
- # 设置压缩级别,压缩级别越高压缩时间越长 (1-9)
- gzip_comp_level 4;
- # 设置压缩的最小字节数, 页面Content-Length获取
- gzip_min_length 1000;
- # 设置压缩文件的类型 (text/html)
- gzip_types text/plain application/javascript text/css;
- }
执行命令 nginx -s reload,成功后浏览器访问
- # 根据状态码,返回对于的错误页面
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root /source/error_page;
- }
执行命令 nginx -s reload,成功后浏览器访问
跨域的定义
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
同源的定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
例如:
http://xx_domain
https://github.com
现在http://xx_domain
对https://github.com
发起请求一定会出现跨域。
不过只需要启动一个nginx服务器,将server_name
设置为xx_domain
,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理回github.com
。如下面的配置:
- ## 配置反向代理的参数
- server {
- listen 8080;
- server_name xx_domain
-
- ## 1. 用户访问 http://xx_domain,则反向代理到 https://github.com
- location / {
- proxy_pass https://github.com;
- proxy_redirect off;
- proxy_set_header Host $host; # 传递域名
- proxy_set_header X-Real-IP $remote_addr; # 传递ip
- proxy_set_header X-Scheme $scheme; # 传递协议
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
这样可以完美绕过浏览器的同源策略:github.com
访问nginx
的github.com
属于同源访问,而nginx
对服务端转发的请求不会触发浏览器的同源策略。
虚拟主机( Virtual Host )可以在一台服务器上绑定多个域名,架设多个不同的网站,一般在开发机或者要部署多个小网站的服务器上需要配置虚拟主机。为了使得配置文件清晰,可以给每一个虚拟主机建立一个配置文件,然后在主配置文件(nginx.conf)里使用include语句包含所有的虚拟主机配置文件。
nginx 的虚拟主机配置其实也挺简单,
建立存放虚拟主机配置文件的文件夹:sudo mkdir /usr/local/etc/nginx/vhosts
建立虚拟主机配置文件:sudo vim /usr/local/etc/nginx/vhosts/domain1.com.conf
在配置文件中,填写如下内容(其中 domain1.com 需要替换成你自己的域名):
server {
listen 80;
server_name domain1.com www.domain1.com;
access_log /var/log/access_domain1.log main;
location / {
root /var/www/domain1.com;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/domain1.com/$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.ht {
deny all;
}
}
在主配置文件中,include 所有的虚拟主机配置:sudo vim /usr/local/etc/nginx/nginx.conf
# 在 http 配置节的结束花括号 } 前一行加入如下语句
include /usr/local/etc/nginx/vhosts/*;
执行:nginx -s reload 重新加载 Nginx 配置文件即可完成配置
配置 虚拟主机的3种方法:
两个物理网卡,两个IP
# 两张物理网卡ens32和ens34
[root@nginx network-scripts]# ifconfig ens32 | awk 'NR==2 {print $2}'
192.168.126.41[root@nginx network-scripts]# ifconfig ens34 | awk 'NR==2 {print $2}'
192.168.126.42
编辑配置文件,基于每个 IP 创建一个虚拟主机
# 为防止 /etc/nginx/conf.d/default.conf 配置文件影响,对其进行重命名
[root@nginx ~]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default[root@nginx ~]# vim /etc/nginx/conf.d/ip.conf
# ens32网卡对应的虚拟主机
server {
listen 192.168.126.41:80;location / {
root /ip_ens32;
index index.html;
}
}# ens34 网卡对应的虚拟主机
server {
listen 192.168.126.42:80;location / {
root /ip_ens34;
index index.html;
}
}
创建虚拟主机的网页文件目录及文件
[root@nginx ~]# mkdir /ip_ens32
[root@nginx ~]# mkdir /ip_ens34[root@nginx ~]# echo "ens32" > /ip_ens32/index.html
[root@nginx ~]# echo "ens34" > /ip_ens34/index.html
检查配置文件的语法
[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重载 nginx 服务
[root@nginx ~]# systemctl reload nginx
测试
[root@nginx ~]# curl 192.168.126.41
ens32
[root@nginx ~]# curl 192.168.126.42
ens34
为一个物理网卡配置多个ip
ip addr add IP/MASK dev 网卡名
# 删除
ip addr del IP/MASK dev 网卡名
其余步骤同上面多网卡多IP的配置
基于端口
配置
[root@nginx ~]# vim /etc/nginx/conf.d/port.conf
server {
listen 81;location / {
root /port_81;
index index.html;
}
}server {
listen 82;location / {
root /port_82;
index index.html;
}
}[root@nginx ~]# mkdir /port_{81..82}
[root@nginx ~]# echo "81" > /port_81/index.html
[root@nginx ~]# echo "82" > /port_82/index.html[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx ~]# systemctl reload nginx
测试
[root@nginx ~]# curl 192.168.126.41:81
81
[root@nginx ~]# curl 192.168.126.41:82
82
一般一个域名对应一个配置文件,便于管理
[root@nginx ~]# vim /etc/nginx/conf.d/test1.dxk.com.conf
server {
listen 80;
server_name test1.dxk.com;location / {
root /test1;
index index.html;
}
}[root@nginx ~]# vim /etc/nginx/conf.d/test2.dxk.com.conf
server {
listen 80;
server_name test2.dxk.com;location / {
root /test2;
index index.html;
}
}[root@nginx ~]# mkdir /test{1..2}
[root@nginx ~]# echo "test1" > /test1/index.html
[root@nginx ~]# echo "test2" > /test2/index.html[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful[root@nginx ~]# systemctl reload nginx
测试
# 配置域名解析
[root@nginx ~]# echo -e "192.168.126.41 test1.dxk.com\n192.168.126.41 test2.dxk.com" >> /etc/hosts
[root@nginx ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.126.41 test1.dxk.com
192.168.126.41 test2.dxk.com[root@nginx ~]# curl test1.dxk.com
test1
[root@nginx ~]# curl test2.dxk.com
test2
这里有个问题:
如果在配置域名解析时由于写错了,那么访问该错误域名(未配置该错误域名的虚拟主机)时竟然还会返回网页内容。
[root@nginx ~]# vim /etc/hosts
192.168.126.41 test1.dxk.com
192.168.126.41 test3.dxk.com # 这里本应该是 test2.dxk.com ,但是由于写错了,而且对应test3.dxk.com域名的虚拟主机并不存在
访问该错误域名
[root@nginx ~]# curl test3.dxk.com
test1# 可以看到,还是会返回网页信息
因为在配置域名解析时,虽然域名写错了,但是IP是对的,那么此时服务端默认会返回满足是该IP且端口为80的排在第一个的虚拟主机的网页信息给客户端
[root@nginx ~]# ll /etc/nginx/conf.d/
-rw-r--r--. 1 root root 112 Jul 3 21:23 test1.dxk.com.conf
-rw-r--r--. 1 root root 112 Jul 3 21:22 test2.dxk.com.conf
Master 进程的作用
读取并验证配置文件 nginx.conf;管理 worker 进程;
Worker 进程的作用
worker 进程负责处理具体的请求。每一个 Worker 进程都维护一个线程(避免线程切换),处理连接和请求;注意 Worker 进程的个数由配置文件决定,一般和 CPU 个数相关(有利于进程切换),配置几个就有几个Worker进程。
Nginx 热部署
所谓热部署,就是配置文件 nginx.conf 修改后,不需要 stop Nginx,不需要中断请求,就能让配置文件生效!
重新加载:nginx -s reload
检查配置:nginx -t
停止:nginx -s stop
Nginx 如何做到高并发下的高效处理
一般 Nginx 的 worker 进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。
作为专业的程序员,我们可以开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。
Nginx 挂了怎么办
Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。
答案是:Keepalived+Nginx实现高可用。
Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合)
Keepalived+Nginx 实现高可用的思路:
- 第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
- 第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)
主要有4大应用场景
为了加快服务器的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。
动静分离其实就是 Nginx 服务器将接收到的请求分为 动态请求 和 静态请求。
nginx 动静分离的好处
示例配置
server {
listen 8080;
server_name localhost;location / {
root html; # Nginx默认值
index index.html index.htm;
}
# 静态化配置,所有静态请求都转发给 nginx 处理,存放目录为 my-project
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/var/www/my-project; # 静态请求所代理到的根目录
}
# 动态请求匹配到path为'node'的就转发到8002端口处理
location /node/ {
proxy_pass http://localhost:8002; # 充当服务代理
}
}
访问静态资源 nginx 服务器会返回 my-project 里面的文件,如获取 index.html:
访问动态请求 nginx 服务器会将它从8002端口请求到的内容,原封不动的返回回去:
正向代理(forward)意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
图示:关于正向代理和反向代理
举个例子:内网一台机子A不能访问 https://www.baidu.com,另一台B能访问https://www.baidu.com,那在B上安装 nginx 并做一个正向代理
Nginx 做代理服务器代理支持HTTPS请求:https://www.jianshu.com/p/b1b5ef4636dd
原生 nginx 只支持 http 正向代理,为了 nginx 支持 https 正向代理,可以打ngx_http_proxy_connect_module-master 补丁+ ssl模块支持,没有这个 nginx 就无法代理https 的请求。地址:https://github.com/chobits/ngx_http_proxy_connect_module
ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器nginx正向代理http, https亲测可用:https://www.cnblogs.com/chenjinxi/p/13265877.html
Nginx之正向代理与反向代理进阶(支持https):https://zhuanlan.zhihu.com/p/629353778
Module ngx_http_proxy_module:https://nginx.org/en/docs/http/ngx_http_proxy_module.html
反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
反向代理的作用
配置反向代理
server {
listen 8080;
server_name localhost;
location / {
root html; # Nginx默认值
index index.html index.htm;
}
proxy_pass http://localhost:8000; # 反向代理配置,请求会被转发到8000端口
}
反向代理的表现很简单。上面的代码块其实就是向 nginx 请求 localhost:8080 跟请求 http://localhost:8000 是一样的效果。这是一个反向代理最简单的模型,只是为了说明反向代理的配置。但是现实中反向代理多数是用在负载均衡中。
nginx 就是充当图中的 proxy。左边的3个 client 在请求时向 nginx 获取内容,是感受不到3台 server 存在的。此时,proxy就充当了3个 server 的反向代理。
反向代理应用十分广泛,CDN 服务就是反向代理经典的应用场景之一。除此之外,反向代理也是实现负载均衡的基础,很多大公司的架构都应用到了反向代理。
反向代理过程中,对请求来说是透明的,比如说 request -> Nginx -> Tomcat,那么对于 Tomcat 而言,请求的 IP 地址就是 Nginx 的地址,而非真实的 request 地址,这一点需要注意。不过好在Nginx 不仅仅可以反向代理请求,还可以由用户 自定义设置HTTP HEADER。
负载均衡是什么?
如果请求数过大,一台服务已经满足不了系统要求,则可以增加服务器的数量,这个时候就出现了服务器 集群,然后将请求 "均匀地"(严格讲并不一定均匀,可以通过设置权重)分发到各个服务器上,将原先集中到单个服务器的情况改为分配到这个集群中所有的服务器上。这个就叫做 "负载均衡"。
负载均衡的作用
负载均衡 可以解决分摊服务器集群压力的问题。除此之外,Nginx 还带有健康检查(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。一旦发现某台服务器异常,那么在这以后代理进来的客户端请求都不会被发送到该服务器上(直健康检查发现该服务器已恢复正常),从而保证客户端访问的稳定性。
配置负载均衡并不复杂:
代码如下:
upstream balanceServer {
server 10.1.22.33:12345;
server 10.1.22.34:12345;server 10.1.22.35:12345;
}server {
server_name fe.server.com;
listen 80;
location /api {
proxy_pass http://balanceServer;
}
}
上面的配置只是指定了 nginx 需要转发的服务端列表,并没有指定分配策略。默认情况下采用的是轮询策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。
Nginx支持的负载均衡调度算法方式如下:
1.Nginx负载均衡服务器:IP:192.168.0.4 (Nginx-Server)
2.Web服务器列表:
Web1:192.168.0.5 (Nginx-Node1/Nginx-Web1)
Web2:192.168.0.7 (Nginx-Node2/Nginx-Web2)
3.实现目的:用户访问 Nginx-Server (http://mongo.demo.com:8888)时,通过Nginx负载均衡到Web1和Web2服务器
Nginx 负载均衡服务器的nginx.conf配置注释如下:
- events
- {
- use epoll;
- worker_connections 65535;
- }
- http
- {
- ##upstream的负载均衡,四种调度算法##
- #调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,
- # 如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
- upstream webhost {
- server 192.168.0.5:6666 ;
- server 192.168.0.7:6666 ;
- }
- #调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
- upstream webhost {
- server 192.168.0.5:6666 weight=2;
- server 192.168.0.7:6666 weight=3;
- }
- #调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,
- # 这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
- upstream webhost {
- ip_hash;
- server 192.168.0.5:6666 ;
- server 192.168.0.7:6666 ;
- }
- #调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,
- # 使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.
- # Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
- upstream webhost {
- server 192.168.0.5:6666 ;
- server 192.168.0.7:6666 ;
- hash $request_uri;
- }
- #调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.
- # 此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,
- # 也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,
- # 如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
- #
- #虚拟主机的配置(采用调度算法3:ip_hash)
- server
- {
- listen 80;
- server_name mongo.demo.com;
- #对 "/" 启用反向代理
- location / {
- proxy_pass http://webhost;
- proxy_redirect off;
- proxy_set_header X-Real-IP $remote_addr;
- #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- #以下是一些反向代理的配置,可选.
- proxy_set_header Host $host;
- client_max_body_size 10m; #允许客户端请求的最大单文件字节数
- client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
- proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
- proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
- proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
- proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
- proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
- proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
- proxy_temp_file_write_size 64k;
- #设定缓存文件夹大小,大于这个值,将从upstream服务器传
- }
- }
- }
负载均衡操作演示如下:
操作对象:192.168.0.4(Nginx-Server)
# 创建文件夹准备存放配置文件
$ mkdir -p /opt/confs
$ vim /opt/confs/nginx.conf
- # 编辑内容如下:
- events
- {
- use epoll;
- worker_connections 65535;
- }
-
- http
- {
- upstream webhost {
- ip_hash;
- server 192.168.0.5:6666 ;
- server 192.168.0.7:6666 ;
- }
-
- server
- {
- listen 80;
- server_name mongo.demo.com;
- location / {
- proxy_pass http://webhost;
- proxy_redirect off;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $host;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 90;
- proxy_send_timeout 90;
- proxy_read_timeout 90;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
- }
- }
- }
然后保存并退出
# 启动负载均衡服务器 192.168.0.4(Nginx-Server)
docker run -d -p 8888:80 --name nginx-server -v /opt/confs/nginx.conf:/etc/nginx/nginx.conf --restart always nginx
操作对象:192.168.0.5(Nginx-Node1/Nginx-Web1)
# 创建文件夹用于存放web页面
$ mkdir -p /opt/html
$ vim /opt/html/index.html# 编辑内容如下:
<div>
<h1>
The host is 192.168.0.5(Docker02) - Node 1!
</h1>
</div>
# 然后保存并退出
# 启动192.168.0.5(Nginx-Node1/Nginx-Web1)
$ docker run -d -p 6666:80 --name nginx-node1 -v /opt/html:/usr/share/nginx/html --restart always nginx
操作对象:192.168.0.7(Nginx-Node2/Nginx-Web2)
# 创建文件夹用于存放web页面
$ mkdir -p /opt/html
$ vim /opt/html/index.html# 编辑内容如下:
<div>
<h1>
The host is 192.168.0.7(Docker03) - Node 2!
</h1>
</div>
# 然后保存并退出
# 启动192.168.0.7(Nginx-Node2/Nginx-Web2)
$ docker run -d -p 6666:80 --name nginx-node2 -v $(pwd)/html:/usr/share/nginx/html --restart always nginx
缓存,是 Nginx 提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。具体配置,可以参考Nginx官方文档,这里不再多说。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。