关于Nginx
Nginx是一个反向代理服务器。Nginx不仅可以部署网站,还可以用于配合WAF进行端口监听,如果某项目端口被该项目持续监听,同时防火墙设置拒绝外网访问该端口,Nginx可以将允许外网连接的自定义端口(未处于被监听状态,其它项目可监听该端口)访问请求转发至防火墙拒绝外网访问的端口,因为Nginx转发数据全程是在内网进行。
1.需要注意的是Nginx开启后它的默认解析目录为/var/www/html,用户只能访问操作服务器上/html/目录内的内容。
2.Nginx还可以管理用户访问的路径。例如用户浏览器输入http://121.3.20.1对服务器进行访问,Nginx可以代理转发用户的访问请求。即用户访问的http://121.3.20.1,Nginx可以直接跳转至http://121.3.20.1:2000,用户访问的http://121.3.20.1/a/index.html,Nginx可以直接跳转至http://121.3.20.1/b/index.html。
本地重新编译安装Nginx
注:也可不编译直接在线安装,但如果需要Nginx使用ssl证书,则必须本地重新编译安装,因为需要重新编译Nginx配置ssl模块。
1.进入指定的文件夹:
代码语言:javascript复制cd /usr/local/src
2.下载指定的Nginx安装包(也可将本地下载的Nginx包上传):
代码语言:javascript复制wget http://nginx.org/download/nginx-1.15.9.tar.gz
3.解压安装包:
代码语言:javascript复制tar -zxvf nginx-1.15.9.tar.gz
4.进入解压的安装包文件夹:
代码语言:javascript复制cd nginx-1.15.9
5.配置ssl模块:
代码语言:javascript复制./configure --prefix=/usr/local/nginx --with-http_ssl_module
6.编译Nginx:
代码语言:javascript复制make
7.使用覆盖的策略进行安装Nginx:
代码语言:javascript复制sudo make install
8.创建必要的目录,并设置权限:
代码语言:javascript复制sudo mkdir -p /usr/local/nginx/logs/
sudo chmod -R 0755 /usr/local/nginx/logs/
sudo mkdir -p /var/cache/nginx
sudo chown -R nginx:nginx /usr/local/nginx/logs/ /var/cache/nginx
9.在/etc/systemd/system/nginx.service目录下创建并保存Nginx服务文件,服务文件内容如下:
代码语言:javascript复制[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
#Description为服务名称,随便取
#nginx.pid的路径,一般都是这个路径
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
#/usr/local/nginx/为安装后的nginx的路径,一定要根据你的系统实际情况手动确认路径是否正确
[Install]
WantedBy=multi-user.target
10.将ssl证书.key和.pem文件上传至服务器,根据自行需要存于指定文件夹下(假设这里文件夹为/usr/local/nginx/cert)
11.编辑Nginx的配置文件,路径通常为:/usr/local/nginx/conf/nginx.conf
代码语言:javascript复制#user为用户,不用改
#error_log为Nginx错误日志存储路径。路径根据nginx的实际目录填写。如果nginx在/usr/local/nginx/解压安装的,一般都在这里。务必确保与第8步骤创建的nginx日志文件夹一致。
user nginx;
worker_processes auto;
error_log /usr/local/nginx/logs/error.log;
pid /run/nginx.pid;
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"';
#client_max_body_size为允许上传最大文件大小为10g,nginx默认最多允许上传1m
client_max_body_size 10240M;
#access_log路径根据nginx的实际目录填写
access_log /usr/local/nginx/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
#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 10k; #最小压缩文件大小,超过1k才压缩
gzip_buffers 16 8k; #压缩缓冲区,16个8k内存
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 6; #压缩等级,建议为6,等级越高压缩越慢
#压缩类型
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml rss text/javascript;
gzip_vary on;
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
include /usr/local/nginx/conf/mime.types; #路径根据nginx的实际目录填写
default_type application/octet-stream;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name #用户访问的域名或IP;
include /etc/nginx/default.d/*.conf;
# 凡是通过80端口访问,都跳转至指定网址和端口
location / {
proxy_pass http://xxx.cn:2000;
}
#该判定优先级比“/”高,因为它是Nginx使用正则表达式匹配,凡是访问/xiaobai/目录内的文件,都跳转至/var/www/html目录。意思是凡是访问/xiaobai/目录的请求都不跳转到http://xxx.cn:2000,而是跳转至/var/www/html目录。
#例用户http://www.abc.com/a/xiaobai/index.html,则该请求会被Nginx转发至此,处代理转发为http://www.abc.com/var/www/html/xiaobai/index.html。
#由于Nginx不能访问服务器上的全部文件,只能访问默认设定的指定目录(一般为/var/www/html/),所以此请求相当于用户访问/var/www/html/xiaobai/index.html文件
location /xiaobai/ {
root /var/www/html;
}
}
#访问一级域名时,第一个项目时跳转到3000端口
server {
# 监听端口,开启ssl, 这里ssl就是上面安装的ssl模块
listen 443 ssl;
listen [::]:443 ssl;
# 域名,多个以空格分开
server_name xxx.cn www.xxx.cn; #当有多个server时,会根据域名进行区分选择执行哪个server
# 配置RSA算法证书
ssl_certificate /usr/local/nginx/cert/xxx.cn.pem; #需修改为实际证书文件路径
ssl_certificate_key /usr/local/nginx/cert/xxx.cn.key; #需修改为实际私钥文件路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 配置加密套件# ssl_ciphers HIGH: !aNULL: !MD5;
ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3:ECDHE-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-GCM-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!RC4:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
#对 "/" 启用反向代理
#用户通过https访问时,加载完ssl证书后,如果访问域名为xxx.cn www.xxx.cn,默认执行该server转发访问请求至2000端口,http://127.0.0.1:2000
location / {
#因为https是不能识别端口的,遇到端口会自动去除掉换成443端口隐性显示,所以返回用http
proxy_pass http://127.0.0.1:2000;
proxy_redirect off; #不对返回结果进行任何处理,直接返回原始数据
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#访问二级域名时,第2个项目时默认跳转到2001端口,如果用户访问连接中有https://baobao.xx.cn/baobei/index.html,则执行/var/www/html/baobei/index.html文件
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name baobao.xx.cn;
# 配置RSA算法证书
ssl_certificate /usr/local/nginx/cert/jianfei.hbswhsxy.cn.pem; #需修改为实际证书文件路径
ssl_certificate_key /usr/local/nginx/cert/jianfei.hbswhsxy.cn.key; #需修改为实际私钥文件路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 配置加密套件# ssl_ciphers HIGH: !aNULL: !MD5;
ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3:ECDHE-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-GCM-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!RC4:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
#需要注意不要输入域名,会出问题,输入120.0.0.1
location / {
proxy_pass http://127.0.0.1:2001;
proxy_redirect off;
}
# 处理含有/baobei/的url.如果用户访问连接中有https://baobao.xx.cn/baobei/index.html,则执行/var/www/html/baobei/index.html文件
location /baobei/ {
root /var/www/html;
}
#处理含有/baobei/server/的url,当访问/baobei/server/的目录时会通过https的443端口进入nginx这里,然后完成跳转
location /baobei/server/ {
proxy_pass http://localhost:7000/r/x;
proxy_redirect off;
}
}
#后续还有其它项目可以都放在二级域名不同目录内,ngifx根据目录进行区分
}
12.编辑环境变量,使在任意路径都可使用nginx:
代码语言:javascript复制source ~/.bashrc
13.使编辑的环境变量改动立即生效:
代码语言:javascript复制source ~/.bashrc
14.运行nginx:
代码语言:javascript复制sudo systemctl start nginx
15.验证nginx是否成功安装ssl模块:
代码语言:javascript复制nginx -V
16.修改后Nginx的配置文件后需要重新载入Nginx配置文件才可生效:
代码语言:javascript复制sudo systemctl reload nginx
17.设置Nginx开机自启动
代码语言:javascript复制sudo systemctl enable nginx
18.进入/usr/sbin/sestatus下查看sestatus,如果不是disabled ,修改为SELINUX=disabled,重启