Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器,使用C语言开发。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。
日常中的并发量上限4万左右。
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打www.baidu.com就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。
免费开源版的官方网站:http://nginx.org/en/download.html,可以下载稳定版(Stable version)
Nginx 有 Windows 版本和 Linux 版本,但更推荐在 Linux 下使用 Nginx;
下载nginx-1.14.2.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz
或者在Windows上下载下来再上传到Linux中
Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误,相关库有:
一次性检查并安装,若已安装则跳过,若有更新,则进行更新:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
检查库是否安装成功,下面的命令只能一个一个的检查,或者再运行一遍上面的命令,若没有操作则说明相关库已经存在:
yum list installed | grep gcc
yum list installed | grep openssl
yum list installed | grep pcre
yum list installed | grep zlib
解压下载下来的nginx文件(.tar.gz),执行命令:tar -zxvf nginx-1.18.0.tar.gz
切换至解压后的nginx主目录,在nginx主目录nginx-1.18.0下执行命令:
# 简洁配置,--prefix后的参数是安装路径,要自己修改
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module
# 详细配置(需要自己下载相应的模块,安装完后也可以添加)
./configure \
--prefix=/user/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/log/error.log \
--http-log-path=/usr/local/nginx/log/access.log \
--pid-path=/usr/local/nginx/log/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_v2_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
# 下面的三个配置,请先下载第三方模块,详见(第二章第7节)
--with-pcre=../pcre-8.44
--with-zlib=../zlib-1.2.11
--with-openssl=../openssl-1.1.1g
常用编译选项说明(更多请查看官方文档:https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#sources):
nginx
大部分常用模块,编译时./configure --help
查看以--without
开头的都默认安装。
--prefix=PATH
: 指定nginx的安装目录。默认 /usr/local/nginx
--conf-path=PATH
: 设置nginx.conf
配置文件的路径。nginx
允许使用不同的配置文件启动,通过命令行中的-c
选项。默认为prefix/conf/nginx.conf
--user=name
: 设置nginx工作进程的用户。安装完成后,可以随时在 nginx.conf 配置文件更改user指令。默认的用户名是 nobody。–group=name 类似
--with-pcre
: 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(最新版本号)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
--with-zlib=PATH
: 指定 zlib(最新版本号)的源码解压目录。在默认就启用的网络传输压缩模块 ngx_http_gzip_module 时需要使用zlib 。
--with-openssl
:支持HTTPS协议。(最新版本号)
--with-http_ssl_module
:使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--with-http_stub_status_module
:用来监控 Nginx 的当前状态
--with-http_realip_module
: 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
--with-http_v2_module
:开启 HTTP/2请求支持
--add-module=PATH
: 添加第三方外部模块,如 nginx-sticky-module-ng 或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)
执行命令进行编译:make
执行命令进行安装:make install
安装成功后,可以切换到/usr/local/nginx目录下,查看内容
.default
结尾的是默认配置./nginx
-c
指定配置文件的位置,而且配置文件路径必须指定绝对路径-t
参数,检查配置文件是否存在语法错误./nginx -c /usr/local/nginx/conf/nginx.conf # 相对路径启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 绝对路径启动
./nginx -c /usr/local/nginx/conf/nginx.conf -t # 检查配置文件是否存在语法错误
查看进程:ps -ef | grep nginx
nginx 体系结构由 master 进程和其 worker 进程组成,启动成功后至少有两个进程,少于两个则没有成功
Nginx的默认端口为80,在浏览器中访问 http://ip地址:80
即可访问到Nginx,(默认端口为80时,在地址栏中可以不指定端口)
ps -ef | grep nginx
kill -QUIT 主pid
注意:
ps -ef | grep nginx
kill -TERM 主pid
注意:
ps -ef | grep nginx
kill -9 主pid
重启使用的较多,当修改配置文件后,便需要重启Nginx,重启时不需要指定配置文件,使用的是最近一次启动时用的配置文件
注意:如果用同一个Nginx使用多个不同的配置文件启动了多个Nginx,则不能使用重启,因为Nginx会不知道重启哪个配置文件
./nginx -s reload
以安装 PCRE 为例(这里是对官方文档进行详细描述,要找到对应版本Nginx的模块):
安装新模块要使用到 Nginx
未编译前的目录,
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.44.tar.gz
$ tar -zxf pcre-8.44.tar.gz
$ cd pcre-8.44
$ ./configure
$ make
$ sudo make install
在 /etc/init.d
目录下创建一个脚本文件
$ cd /etc/init.d/
$ vim nginx.sh
文件中添加如下内容
#!/bin/bash
# chkconfig: 3 88 88
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
脚本默认是以 root 用户运行的,如果使用其它用户运行,例如 nginx 用户,则这样写:
#!/bin/bash # chkconfig: 3 88 88 su - nginx -c '/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf'
修改脚本执行权限
$ chmod 755 nginx.sh
添加到 chkconfig,开机自启动
$ chkconfig --add nginx.sh
其它 chkconfig 命令
# 查看 chkconfig 列表
$ chkconfig --list nginx.sh
nginx.sh 0:off 1:off 2:off 3:on 4:off 5:off 6:off
# 关闭开机自启
$ chkconfig nginx.sh off
# 从chkconfig管理中删除nginx.sh
$ chkconfig --del nginx.sh
直接在 /etc/rc.local
中进行配置(如果文件中有 exit 0
,则需要配置到 exit 0
前面):
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
-v
:显示 nginx 的版本-V
:显示 nginx 的版本、编译器版本和配置参数在官方网站下载最新windows版的nginx:http://nginx.org/en/download.html
将下载下来的nginx压缩包解压到一个目录下,解压后该软件就可以启动使用了
启动方式1:双击解压目录下的nginx.exe
文件即可运行nginx;
启动方式2:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:start nginx
关闭方式1:在资源管理器杀掉Nginx进程(有两个进程)
关闭方式2:在dos窗口切换到Nginx安装主目录下执行命令:nginx -s stop
学习Nginx首先需要对它的核心配置文件有一定的认识,这个文件位于Nginx的安装目录/usr/local/nginx/conf
目录下,名字为nginx.conf
Nginx的核心配置文件主要由三个部分构成:基本配置,events配置,http配置
在文件中直接进行配置的是基本配置:
#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
#user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 1;
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; #配置进程pid文件
events主要用于配置工作模式和连接数,在 events{}
中进行配置
events {
# 配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
# 需要注意的是,worker_connections最大为 65536
worker_connections 1024;
}
http {
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
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日志及存放路径,并使用上面定义的main日志格式,需要与上面的日志格式同时打开
#access_log logs/access.log main;
sendfile on; #开启高效文件传输模式
#tcp_nopush on; #防止网络阻塞,上线时必须开
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#gzip on; #开启gzip压缩输出,上线时必须开,开发时不开,防止没有格式
###-----------------------------------------------
#配置虚拟主机
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名,详见3.3.3
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
#root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
root html;
#配置首页文件的名称
index index.html index.htm;
}
#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x错误页面
#精确匹配
location = /50x.html {
root html;
}
#PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#PHP 脚本请求全部转发到FastCGI处理
# 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;
#}
#禁止访问 .htaccess 文件
# 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服务,安全的网络传输协议,加密传输,端口443,运维来配置
#
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.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;
# }
#}
}
http配置主要是配置http服务器,利用它的反向代理功能提供负载均衡支持,在 http{}
中进行配置
注意:
gzip on(开发时不开)
,tcp_nopush on
比如 F5、深信服、Array 等
比如 Nginx、LVS、HAProxy 等
所以,实际中,往往会两者结合使用,在关键的位置使用硬件负载均衡,而其余地方使用软件负载均衡
upstream www.myweb.com {
server 127.0.0.1:9100;
server 127.0.0.1:9200;
}
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器
http://
加上 upstream 后面的字符串(固定结构:proxy_pass http://
)location /myweb {
proxy_pass http://www.myweb.com;
}
nginx反向代理配置时,后端的tomcat会出现request.getServerName()取不到代理地址(或域名)的问题,需要在location中添加下面的参数:
location /myweb {
proxy_pass http://www.myweb.com;
proxy_set_header Host $host;
}
参考:http://www.phpfensi.com/php/20131127/466.html
很详细:https://blog.csdn.net/t8116189520/article/details/80668651
实际中,若是服务器配置相同,则可以使用轮询,若配置不同,简单一点可以使用最小连接,也可以经过测试后,使用权重。至于Session丢失问题,这里使用的是通过SpringSession来解决:https://editor.csdn.net/md?articleId=103880228。
这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,访问比率约等于权重之比,权重越大访问机会越多,用于后端服务器性能不均的情况
当后端服务器有一台挂掉时,nginx 会根据预先设置的权重转发请求,若给某一台服务器转发请求时,达到默认超时时间未响应,则再向另一台服务器转发请求。默认超时时间1分钟。
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
web请求会被转发到连接数最少的服务器上
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
backup:其它所有的非backup机器down的时候,才请求backup机器:
upstream backserver {
server 127.0.0.1:9100;
#其它所有的非backup机器down的时候,才请求backup机器
server 127.0.0.1:9200 backup;
}
down:down表示当前的server是down状态,不参与负载均衡:
upstream backserver {
server 127.0.0.1:9100;
#down表示当前的server是down状态,不参与负载均衡
server 127.0.0.1:9200 down;
}
proxy_connect_timeout
: 连接超时时间,默认是60S
proxy_read_timeout
:真实服务器处理超时时间,默认是60S
proxy_send_timeout
:发送超时时间,默认是60S
proxy_next_upstream off:禁用 Nginx 的默认高可用性,默认连接失败或者超时请求会自动转到下一台服务器,有风险,因为会产生两次处理
upstream web{
server 127.0.0.1:9100 max_fails=1 fail_timeout=30; #设置失败1次,30s内不在往这台设备转发
server 127.0.0.1:9200 max_fails=1 fail_timeout=30;
}
server {
listen 80;
location / {
proxy_connect_timeout 30s
proxy_read_timeout 30s;
proxy_send_timeout 30s;
proxy_next_upstream off;
proxy_pass http://web;
}
}
使用模块:ngx_http_upstream_check_module,官方文档:http://tengine.taobao.org/document/http_upstream_check.html
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
说明:
~
:表示正则匹配,也就是说后面的内容可以是正则表达式匹配.
’ 表示任意字符*
:表示一个或多个字符\.
: 是转义字符,是后面这个点的转义字符|
: 表示或者$
:表示结尾整个配置表示以 '.
'后面括号里面的这些后缀结尾的文件都由nginx处理
注意:放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限; 否则会出现403错误
当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
location ~ .*/(css|js|img|images) {
root /opt/static;
}
整个配置表示路径中含有这些括号里面的关键字的请求,都由nginx处理
注意:Nginx查找静态资源位置也是根据ip + port
等于root
的原则查找图片,假如网页请求的图片地址为http://192.168.235.128/myweb/image/001.jpg
,不管是方式一还是方式二,请求都会交给nginx服务器进行处理。根据ip + port
等于root
的原则,Nginx会找位置为/opt/static/myweb/image/001.jpg
的图片
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
它们各司其职,专注于做自己擅长的事情
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构
一个域名只能绑定一台机器,一个 ip,而虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站,绑定多个域名。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server{}
标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
基于端口的虚拟主机配置,使用端口来区分
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;
# 当访问:nginx-host:8080 -> http://www.baidu.com
server {
listen 8080;
server_name www.myweb.com;
location / {
proxy_pass https://www.baidu.com;
}
}
# 当访问:nginx-host:9090/ -> http://www.p2p.com
server {
listen 9090;
server_name www.myweb.com;
location / {
proxy_pass http://www.p2p.com;
}
}
基于域名的虚拟主机是最常见的一种虚拟主机,通过 http.server.server_name
来匹配域名
server {
listen 80;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
server_name
指令主要用于配置基于名称的虚拟主机,当访问 nginx 时,根据域名来判断匹配哪个 server,server_name
指令在接到请求后会按如下的匹配顺序进行匹配,如果都匹配不上,则默认执行第一个 server
。
1、准确的server_name匹配,例如:
server {
listen 80;
server_name domain.com www.domain.com;
...
}
2、以*通配符开始的字符串:
server {
listen 80;
server_name *.domain.com;
...
}
3、以*通配符结束的字符串:
server {
listen 80;
server_name www.*;
...
}
4、匹配正则表达式:
server {
listen 80;
server_name ~^(?.+)\.domain\.com$;
...
}
server {
listen 8080;
server_name localhost;
location /t1 {
proxy_pass http://10.211.55.2:10000;
}
location /t2 {
proxy_pass http://10.211.55.2:10000/;
}
location /t3 {
proxy_pass http://10.211.55.2:10000/index;
}
location /t4 {
proxy_pass http://10.211.55.2:10000/index/;
}
location /t5/index {
proxy_pass http://10.211.55.2:10000;
}
location /t6/index {
proxy_pass http://10.211.55.2:10000/;
}
location /t7/index {
proxy_pass http://10.211.55.2:10000/index;
}
location /t8/index {
proxy_pass http://10.211.55.2:10000/index/;
}
}
需要注意的是,在以上的配置中,t1
和 t5
两个配置中的代理服务器( proxy_pass
)设置是没有指定 URI
的,而剩下的代理服务器设置都指定了 URI
的(分别为 /
和 /index
和 /index/
)。
如果代理服务器地址中是带有 URI
的,此 URI
会替换掉 location
所匹配的 URI
部分。
如果代理服务器地址中是不带有 URI
的,则会用完整的请求 URL
来转发到代理服务器。
上面的配置中,相应的请求地址与转发地址示例如下:
localhost:8080/t1 -->> http://10.211.55.2:10000/t1
localhost:8080/t1/ -->> http://10.211.55.2:10000/t1/
localhost:8080/t1/index -->> http://10.211.55.2:10000/t1/index
localhost:8080/t2 -->> http://10.211.55.2:10000/
localhost:8080/t2/ -->> http://10.211.55.2:10000//
localhost:8080/t2/index -->> http://10.211.55.2:10000//index
localhost:8080/t2index -->> http://10.211.55.2:10000/index
localhost:8080/t3 -->> http://10.211.55.2:10000/index
localhost:8080/t3/ -->> http://10.211.55.2:10000/index/
localhost:8080/t3/index -->> http://10.211.55.2:10000/index/index
localhost:8080/t4 -->> http://10.211.55.2:10000/index/
localhost:8080/t4/ -->> http://10.211.55.2:10000/index//
localhost:8080/t4/index -->> http://10.211.55.2:10000/index//index
localhost:8080/t5/index -->> http://10.211.55.2:10000/t5/index
localhost:8080/t6/index -->> http://10.211.55.2:10000/
localhost:8080/t7/index -->> http://10.211.55.2:10000/index
localhost:8080/t8/index -->> http://10.211.55.2:10000/index/
server {
listen 8080;
server_name localhost;
location /health {
root html;
index index.html index.htm;
}
}
root
参数表示:
/
则表示 nginx的安装路径,例如:默认指定为html,即表示为nginx安装主目录下的html目录/
则表示 Linux 中的根路径(/
)路径/
与 root
后的路径是一一对应的:举个例子:比如说的我 Nginx 的ip为192.168.0.1,端口为 80,location 参数指定的值为 /aa(相当于是war包的名字),root 配置参数指定的值为 /opt/web(相当于把war包直接放到里面),若访问路径为 http://192.168.0.1:80/aa/index.html,则Nginx会访问 /opt/web/aa/index.html 静态文件
# 默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
# 网站为:http://www.ip:80/aa
location /aa {
# root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
# 磁盘路径为:/opt/web/aa
root /opt/web;
}
在windows中模拟DNS服务器解析域名:
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置(前面是Linux的IP,后面是你自定义的域名):
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com
可以将多个server{}标签配置在一个 nginx.conf 文件的 http{} 标签中,也可以单独配置在一个文件中,然后通过include
的方式引入虚拟主机配置
include /usr/local/nginx/conf/vhost/vhost.conf;
将虚拟目录的配置文件加入到”http {}”部分的末尾,与其他server并列;
文件是隔开的,配置更清晰,主文件没有那么多的server
http{
......
# 在http模块下加入下面的代码,然后在conf.d文件夹下写虚拟主机的配置
include /ect/nginx/conf.d/*.conf
}
conf.d
目录下文件的优先级是按文件名字母序来的,同一个文件里的优先级是从上至下的(即有冲突的内容前面的匹配到后会忽略后面的)
语法
log_format name [escape=default|json] string ...;
name
:格式名称。在 access_log
指令中引用。escape
:设置变量中的字符编码方式是 json
还是 default
,默认是 default
。string
:要定义的日志格式内容。该参数可以有多个。参数中可以使用 Nginx 变量。示例:
http {
log_format main '$remote_addr|$remote_user|$time_local|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent|$http_x_forwarded_for|$request_time|$request_body';
access_log logs/access.log main;
server {
listen 80;
server_name localhost;
access_log logs/host.access.log main;
}
}
常用 Nginx 变量:
变量 | 含义 |
---|---|
$bytes_sent | 发送给客户端的总字节数 |
$body_bytes_sent | 发送给客户端的字节数,不包括响应头的大小 |
$connection | 连接序列号 |
$connection_requests | 当前通过连接发出的请求数量 |
$msec | 日志写入时间,单位为秒,精度是毫秒 |
$pipe | 如果请求是通过http流水线发送,则其值为"p",否则为“." |
$request_length | 请求长度(包括请求行,请求头和请求体) |
$request_time |
请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止 |
$status |
响应状态码 |
$time_iso8601 | 标准格式的本地时间,形如“2017-05-24T18:31:27+08:00” |
$time_local | 通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800" |
$http_referer | 请求的referer地址。 |
$http_user_agent | 客户端浏览器信息。 |
$remote_addr |
客户端IP |
$http_x_forwarded_for |
当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。 |
$request |
完整的原始请求行,如 “GET / HTTP/1.1” |
$remote_user | 客户端用户名称,针对启用了用户认证的请求 |
$request_uri |
完整的请求地址,如 “https://daojia.com/” |
$request_body | 请求体 |
安装 OpenResty
,照着官方文档安装就行:http://openresty.org/cn/installation.html
openresty
是一个打包程序,其中不仅包含了Nginx
,还包含了大量的第三方Nginx
模块,包括lua
。其中的ngx_lua
模块来帮助 nginx 日志记录 response。
我安装时的步骤:
# http://openresty.org/cn/installation.html#fedora-%E5%92%8C-redhat-%E7%94%A8%E6%88%B7
yum install pcre-devel openssl-devel gcc curl
# 下载最新版:http://openresty.org/cn/download.html#%E6%9C%80%E6%96%B0%E7%89%88
# 解压并安装:http://openresty.org/cn/installation.html#%E6%9E%84%E5%BB%BA-openresty
tar -xzvf openresty-1.19.9.1.tar.gz
cd openresty-1.19.9.1/
./configure --prefix=/opt/openresty \
--with-luajit \
--without-http_redis2_module \
--with-http_iconv_module
gmake && gmake install
注意:
./configure
配置时,除了多了的配置,其它配置与安装 nginx 时一样,命令 .configure --help
查看全部配置/opt/openresty/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("hello, world
")
}
}
}
}
nginx
,访问 localhost:8080
,看是否成功打印 hello, world
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
log_format main '$resp_body';
access_log logs/access.log main;
server {
listen 80;
server_name localhost;
set $resp_body "";
location / {
proxy_pass http://www.baidu.com;
lua_need_request_body on;
body_filter_by_lua '
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
';
}
}
}
参考:https://blog.csdn.net/wen_1108/article/details/78270381
在需要关闭的请求路径下,设置 access_log off;
即可
http {
log_format main '$remote_addr';
access_log logs/access.log main;
server {
listen 80;
server_name localhost;
location /health {
# 在需要关闭的请求路径下,设置 access_log off; 即可
access_log off;
root html;
index index.html index.htm;
}
}
}
在 nginx 配置文件中增加如下配置:
location / {
root ...
index ...
try_files $uri $uri/ /index.html; ---解决页面刷新404问题
原理:当访问 uri
没有的时候,尝试访问 index.html
,由于 vue
是单页模式,所以入口都是 index.html
无论访问什么连接都由 vue
本身接管
访问后台时,设置一些请求头:
location /prod-api/{
proxy_set_header Host $http_host;//host:端口
proxy_set_header X-Real-IP $remote_addr;//客户端的IP地址
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;//HTTP的请求端真实的IP
proxy_pass http://10.124.128.201:8084/;
}
NGINX conf 配置文件中的变量大全
首先,Nginx
在安装时已经加入了 ssl
模块
server {
listen 443 ssl; # 1.1版本后这样写
server_name www.domain.com; #填写绑定证书的域名
ssl_certificate /ssl/ssl.pem; # 指定证书的位置,绝对路径(.crt文件也行)
ssl_certificate_key /ssl/ssl.key; # 密钥绝对路径
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.124.128.201:8084/;
}
}
这种配置存在的问题(暂时不知道怎么解决):post 请求会丢失请求体(原理,nginx 监听到 8888 端口的http,返回给浏览器 301,然后重定向到指定的 https 地址,对于 POST 请求会转发为 GET 请求,所以会丢失请求体)
server {
listen 8888;
server_name forward;
location /access {
# rewrite ^(.*)$ 转发地址 permanent;
# 请求 ngnixHost:8888/access/index -> https://10.124.128.198:8081/dataproducer/index
rewrite ^(.*)$ https://10.124.128.198:8081/dataproducer permanent;
}
}
nginx 进行正向代理需要使用一个官方模块:ngx_http_proxy_connect_module
官方文档:戳这里
参考博客:使用NGINX作为HTTPS正向代理服务器
参考博客:使用openresty进行nginx正向代理配置
下载模块包,这里直接从 GitHub 上下载 ZIP 包
解压并配置
> unzip ~/pkg/ngx_http_proxy_connect_module-master.zip
# 下面的命令都在nginx解压后的文件中执行
# 这里要根据nginx的版本,选择相应的.patch文件,请参照官方文档
> patch -p1 < /home/admin/pkg/ngx_http_proxy_connect_module-master/patch/proxy_connect_rewrite_1018.patch
# 指定解压出来的模块包的位置
> ./configure --add-module=/home/admin/pkg/ngx_http_proxy_connect_module-master
> make && make install
修改 nginx 配置文件
server {
listen 8080;
# 配置DNS服务器地址
resolver 8.8.8.8 114.114.144.114;
# forward proxy for CONNECT request
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# 正向代理的地址
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
查看DNS服务器:
cat /etc/resolv.conf
> cat /etc/resolv.conf nameserver 202.106.0.20 nameserver 202.106.196.115
nslookup www.baidu.com
> nslookup www.baidu.com Server: 202.106.0.20 Address: 202.106.0.20#53
测试:
使用 -x 参数指定代理服务器地址,-v 参数打印细节
curl https://www.baidu.com -v -x localhost:8080
Nginx
服务建议使用非 root
用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l
如passwd -l nginx
来锁定Nginx服务的启动用户。命令 passwd -S <用户>
如passwd -S nginx
可查看用户状态。
修改配置文件中的 nginx 启动用户修改为 nginx 或 nobody
如:
user nobody;
如果您是docker用户,可忽略该项(或添加白名单)
用户相关操作:
useradd nginx # 添加用户 passwd nginx # 修改密码 su nginx # 切换用户 passwd -l nginx # 锁定用户 passwd -u nginx # 解锁用户 passwd -S nginx # 查看用户状态
非 root 启动的 nginx 是不可以监听 1024 以下的端口的,需要使用如下的命令
# sudo setcap cap_net_bind_service=+ep nginx路径
sudo setcap cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx
1、打开conf/nginx.conf
配置文件;
2、在http
下配置proxy_hide_header
项,增加或修改为
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
1、打开conf/nginx.conf
配置文件;
2、在server栏目下,配置server_tokens
项
server_tokens off;
如出现多项不支持,执行
ln
1、打开conf/nginx.conf
配置文件(或主配置文件中的inlude文件);
2、配置
server {
...
ssl_protocols TLSv1.2;
...
}
备注:配置此项请确认 nginx 支持 OpenSSL,运行 nginx -V
如果返回中包含built with OpenSSL
则表示支持OpenSSL。
如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 是针对每个IP定义一个存储session状态的容器。这个示例中定义了一个10m的容器,按照64bytes/session, 可以处理160000个session。
limit_conn_zone $binary_remote_addr zone=one:10m;
location / {
deny 192.168.1.1; #拒绝IP
allow 192.168.1.0/24; #允许IP
allow 10.1.1.0/16; #允许IP
deny all; #拒绝其他所有IP
# 限制每个ip只能发起一个并发连接,one为变量需在http段配置的limit_conn_zone对应的变量
limit_conn one 1;
# 对每个连接限速200k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。
limit_rate 200k; #限制每个连接的限制速度为20K,IP的下载速度为连接数*限制速度
}
Nginx 其它访问限制模块:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
# 指定每个 TCP 连接最多可以保持多长时间。值为 0 时禁止 keepalive 连接
keepalive_timeout 60;
# 客户端向服务端发送一个完整的 request header 的超时时间
client_header_timeout 10;
# 客户端与服务端建立连接后发送 request body 的超时时间
client_body_timeout 10;
# 服务端向客户端传输数据的超时时间
send_timeout 10;
可以在 http、server、location 中进行配置,默认是 1M
client_max_body_size 20m;