作为coder,不能不知道nginx。
nginx有什么用
1、本身就是个web服务器。可以搭建服务,例如发布静态网页。
2、他是一个反向代理服务器,可以实现负载均衡。
3、邮件服务器。(这个没有实际使用经验)
nginx是模块化的。例如location模块,upstream模块等。
所以在描述的时候,说nginx的常见组件有哪些? 精确的描述是nginx常见的模块有哪些? 一听就让人感觉很专业。
nginx反向代理的过程
通过监听80端口或443端口(https请求),当请求到来时进行代理分发。
可以通过upstream来实现负载均衡。
通过location来实现资源定位。
如何实现所有请求都走nginx
这个除了配置nginx之外,还需要网络配合。
例如对外只开放www.open.com这个域名,直接访问ip是不允许的。
然后在nginx里面,根据www.open.com/user 后缀名进行代理分发。
输入域名直接跳到登录页
指定网址首页,例如www.tiger.com直接跳到登录页,直接写个左斜杠即可:
location / {
return 301 http://www.test.com/login$request_uri;
}
直接跳转到某个地址
例如:原地址为
http://test.com/crm/sso/login?usercode=123
想要跳转到
http://192.168.0.1/crm/sso/login?usercode=123
location /crm/sso/login {
rewrite ^/(.*)$ http://192.168.0.1/crm/sso/login?param=$1 permanent;
}
分析:
rewrite 表示重写路径
$1 表示第一个小括号内的内容
param 这里感觉不对,是不是应该和原来一致,写为usercode?
permanent 表示永远都跳转(permanent本来就是永远的意思)
固定路径多台机器代理
某服务路径固定,例如: 必须是 /user。但是有多个节点,这样常规的location转发就无法满足。怎么办呢?
创建多个server,每个server配置单独的域名(域名到机器的映射需要提前配置好)。
配置如下:
server {
listen 80;
server_name User1.com;
location / {
proxy_pass http://10.192.168.1:9999/user/;
}
}
server {
listen 80;
server_name User2.com;
location / {
proxy_pass http://10.192.168.2:9999/user/;
}
}
没有第一时间想到,说明对nginx理解还远远不够。
搭建服务器
负载均衡
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
autoindex on;
autoindex 设置目录浏览。
on:地址栏到images就会显示文件列表
off:必须要文件全路径,只到目录页面提示403 forbidden
提示 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
说明端口被其他占用
listen 80 default_server;
这个default_server是否去掉有影响吗?
访问ip,不是nginx首页却是centos首页,是说明nginx没有配置成功吧
…
include 指令的作用
除了/etc/nginx.conf 之外,其他的配置文件地址,可以用通配符
默认是:
include /etc/nginx/default.d/*.conf;
强制指定配置文件
/usr/sbin/nginx -c /etc/nginx/nginx.conf;
除80之外的端口不允许直接访问
这个问题其实比较好解。
nginx直接做个代理即可。
即:用路径来访问,把路径转到端口上即可。# 一开始怎么没想到呢
其他
nginx.conf的默认内容
配置文件为 /etc/nginx/nginx.conf,同目录下有nginx.conf.default,相当于备份。
内容为:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
禁用(屏蔽某个ip地址访问某个请求)
场景:
某个请求地址被安扫出无授权访问。需要屏蔽掉,只允许内网(服务器之间)访问,不允许办公网()访问。
也就是说:
如果不是内网地址,访问此接口时报错403。
解决方案:
直接对具体地址加location,然后判断请求地址,如果不在内网网段,返回403。
配置如下,实测有效:
location = /custom/interface/user/query{
if ( $remote_addr !~* 10\.12\..*\..*|10\.192\..*\..*|10\.191\..*\..*) {
return 403 ;
}
proxy_pass http://custom;
}
注:
要用$remote_addr
,不要用$http_origin
。
而且不能在location里面判断$request_uri
,加上这个判断nginx检测报错。
真实ip判断
$remote_addr
是远程请求地址,但是一般只是最近的一层。那么真实ip呢?
当然是可以的。
x-forward-for就表示真实ip,在location中做如下配置,就会把真实ip往后传。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
在后续的nginx中,$proxy_add_x_forwarded_for就可以获取到真实的ip。
如果有多个,是个逗号分隔的列表。
日志中也是可以看的(注:默认一般没有$proxy_add_x_forwarded_for,添加上即可):
log_format main '$remote_addr $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
例如,这是一行日志:
100.122.17.0 10.22.128.189, 10.12.129.12, 100.122.17.0 - - [07/Mar/2025:15:27:11 +0800] "POST /jxcustom/api/pcUploadFile HTTP/1.1" 200 73 "-" "Apache-HttpClient/4.5.9 (Java/1.8.0_352)" "10.22.128.189, 10.12.129.12"
echo模块的使用
想要在nginx中使用echo,默认是不支持的,需要安装echo模块。
下载echo模块:
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
解压:
tar -zcvf echo-nginx-module-0.61.tar.gz;
查看原nginx安装的模块:
nginx -V
再后面添加新模块地址:
–add-module=文件路径
/echo-nginx-module-0.61
安装编译环境:
yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel
然后执行./configure 及后面的一大串内容。
注:如果报错 -bash: configure: command not found
说明没有这个命令,nginx是解压版的还是安装版的呢,如果是解压版的,那么就不好添加模块了,我也不太会。
自定义日志?
待办
nginx和f5的区别
— | nginx | f5 |
---|---|---|
高并发、大流量 | 满足一般流量 | 支持高并发、大流量 |
安全性 | 没有特殊设置 | 高,有多种配置规则 |
成本 | 开源工具,无成本 | 付费(按流量) |
复杂度 | 相对较低 | 高 |
简言之,nginx简单易用,f5复杂且收费。
一般来说,要求比较高的大厂可能要求使用f5,安全系统更高。
官网文档地址
https://nginx.org/en/docs/
location跳转连接:
https://nginx.org/en/docs/http/ngx_http_core_module.html#location