Write the Code. Change the World.

分类目录
6月 28

最近越来越频繁地遇到需要配置反向代理的场景,在自己搭建博客的时候,也不可避免要用到 Nginx,所以这段时间集中学习了一下 Nginx,同时做了一些笔记,希望也可以帮助到大家~ 😜

这篇文章会在 CentOS 环境下安装和使用 Nginx,如果对 CentOS 基本操作还不太清楚的,可以先看看 半小时搞会 CentOS 入门必备基础知识 一文先做了解。

相信作为开发者,大家都知道 Nginx 的重要,废话不多说,一起来学习吧。

CentOS 版本: 7.6

Nginx 版本: 1.16.1

1. Nginx 介绍

传统的 Web 服务器,每个客户端连接作为一个单独的进程或线程处理,需在切换任务时将 CPU 切换到新的任务并创建一个新的运行时上下文,消耗额外的内存和 CPU 时间,当并发请求增加时,服务器响应变慢,从而对性能产生负面影响。

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。

Nginx 的最重要的几个使用场景:

  • 静态资源服务,通过本地文件系统提供服务;

  • 反向代理服务,延伸出包括缓存、负载均衡等;

  • API 服务,OpenResty ;

对于前端来说 Node.js 不陌生了,Nginx 和 Node.js 的很多理念类似,HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等),Node.js 更擅长上层具体业务逻辑的处理,两者可以完美组合,共同助力前端开发。

下面我们着重学习一下 Nginx 的使用。

2. 相关概念

2.1 简单请求和非简单请求

首先我们来了解一下简单请求和非简单请求,如果同时满足下面两个条件,就属于简单请求:

  • 请求方法是 HEAD、GET、POST 三种之一;

  • HTTP 头信息不超过右边着几个字段:Accept、Accept-Language、Content-Language、Last-Event-ID

Content-Type 只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain;

凡是不同时满足这两个条件的,都属于非简单请求。

浏览器处理简单请求和非简单请求的方式不一样:

简单请求

对于简单请求,浏览器会在头信息中增加 Origin 字段后直接发出,Origin 字段用来说明,本次请求来自的哪个源(协议+域名+端口)。

如果服务器发现 Origin 指定的源不在许可范围内,服务器会返回一个正常的 HTTP 回应,浏览器取到回应之后发现回应的头信息中没有包含 Access-Control-Allow-Origin 字段,就抛出一个错误给 XHR 的 error 事件;

如果服务器发现 Origin 指定的域名在许可范围内,服务器返回的响应会多出几个 Access-Control- 开头的头信息字段。

非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUT 或 DELETE,或 Content-Type 值为 application/json。浏览器会在正式通信之前,发送一次 HTTP 预检 OPTIONS 请求,先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 请求方法和头信息字段。只有得到肯定答复,浏览器才会发出正式的 XHR 请求,否则报错。

2.2 跨域

在浏览器上当前访问的网站向另一个网站发送请求获取数据的过程就是跨域请求。跨域是浏览器的同源策略决定的,是一个重要的浏览器安全策略,用于限制一个

文章来源

https://xie.infoq.cn/article/2051e9a2e76e80393353d826a

6月 04

homestead 默认情况,在本机,是可以通过配置的域名访问虚拟机中的站点。可是,你的同事(其他)电脑是访问不了你的站点。既想你同事能访问,又不想用 ip。修改下配置,即可以实现。

这种需求,虽然不常见,但很有必要。因为你们自己没有公网服务器或不方便公网服务器用来测试。而刚好你的修改又需要特殊的测试,这个时候,这种需求就非常有用了。

操作一波

# win10
ipconfig

# mac
ifconfig

# 找到自己的 ip 192.168.1.101(后边会用到)

# 假如你之前已经启动了虚拟机,先关掉比较好
exit
vagrant halt

继续阅读

5月 31

不走 nginx 的代理,请求连接 websocket,总需要带上端口号。比如 new WebSocket("wss://www.xxx.com:9958"),通过 nginx 的代理就可以实现这样的请求,比如 new WebSocket("wss://www.xxx.com/wss")

一波操作

vim www.xxx.com.conf

upstream websocket {
    # wss 配置代理到 127.0.0.1:9958
    server 127.0.0.1:9958;
}

server
{
    listen 80;
    server_name xxx.com www.xxx.com;

    return 301 https://www.xxx.com$request_uri;
}

server
{
    listen 443 ssl http2;
    server_name xxx.com www.xxx.com;

    if ($host = 'xxx.com' ){
        return 301 https://www.xxx.com$request_uri;
    }

    ssl_certificate         /service/nginx/conf/ssl/www.xxx.com.pem;
    ssl_certificate_key     /service/nginx/conf/ssl/www.xxx.com.key;

    location /wss {
        # 代理到上边的自定义的地址
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    …

重启, nginx。

其实,在 proxy_pass 这里,可以直接设置为 127.0.0.1:9958

还有请求的时候,域名后一定要带上 wss 。

5月 31

Client does not support authentication protocol requested by server; conside 新旧版本密码算法不同引起的错误,只需要设置下密码方式为 mysql_native_password 就可。还是 navicat 做的好,新旧密码都支持。

操作一波

mysql -u root -p

xxxx

use mysql;

show tables;

# 查看已经有的用户
select user, host from user;

# 重新设置下密码,并使之生效
# 之前是 'xxx'@'%' IDENTIFIED BY 'xxxxxx'
'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxx'

flush privileges;
5月 30

使用 redis 客户端是比较有必要的,这个时候就需要远程登录 redis 了。不过,redis 默认是无密码,只允许服务端登录。修改下配置,重启 redis 即可实现想要的目的。

一波操作

修改 redis.conf 文件。

  1. 设置密码。因为密码是在配置文件里的 ,所以尽可能的设置长一点,也不怕忘记哈。

修改 # requirepass foobared 为你自己想要的密码 requirepass Safb0xafNabaf!fEfaWfs@#$a4afsdfw8ay

  1. 设置 protected-modeno

  2. 去掉 bind 或 设置为 bind 0.0.0.0

  3. 重启 redis 。

# 使用 conf 启动 redis
./redis-server redis.conf

# 登录客户端
./redis-cli 

auth 密码

# 查看所有配置
config get *

# 查看单独一个的
config get bind

其他

如果发现重启没啥鬼用,可以直接杀死进程,然后以 conf 启动。

ps -ef | grep redis

kill -9 xxxx

./redis-server redis.conf

还有 dump 文件需要注意,默认是 dump.rdb 文件。

5月 12

当你的的 nginx 中设置 Content-Security-Policy,就有可能会遇到: script in the following Content Security Policy directive: "script-src * 'unsafe-inline'"

Content-Security-Policy 策略

最快的解决办法,注释掉 Content-Security-Policy,并重启 nginx

vim xxx.conf

../../sbin/nginx -s reload

参考这里

https://www.cnblogs.com/Hwangzhiyoung/p/9146740.html

5月 06

在 win 中,在终端中使用 git 都会显示分支名,这样很清晰,也很安全。知道当前处于哪个分支。而 linux 下,默认是不显示这些的。这个就得想办法去实现。办法有好几种,这里就来一个简单好用的。

操作来一波

# 如果权限不够 sudo 提升权限

sudo vim ~/.bashrc

# 在末尾追求以下内容
# Show git branch name
force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt

# source 使生效
source ~/.bashrc

到这里,已经看到效果了。

4月 06

nginx 新增模块缺失,

nginx: [emerg] unknown directive "more_clear_headers"

https://blog.csdn.net/chunyuan314/article/details/81737303

安装

https://github.com/openresty/headers-more-nginx-module

cd /usr/local/src

wget https://github.com/openresty/headers-more-nginx-module/archive/v0.33.tar.gz

tar -xzvf v0.33.tar.gz

cd headers-more-nginx-module-0.33

新增模块

# 先准备曾经的配置,找到 configure arguments 后边的配置。

nginx -V

# 找到曾经的包文件
cd /usr /local/src/nginx 

# 再配置后追加 add-module 指向headers-more-nginx-module-0.33

./configure --user=nginx --group=nginx --prefix=/alidata/service/nginx --pid-path=/alidata/service/nginx/run/nginx.pid --with-http_stub_status_module --with-threads --with-file-aio --with-pcre-jit --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_realip_module --with-http_addition_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-http_slice_module --with-pcre --with-openssl=/usr/local/src/base/1-openssl/openssl-1.1.1f --with-openssl-opt=enable-tls1_3 --add-module=/opt/ngx_brotli/ --add-module=/usr/local/src/nginx/headers-more-nginx-module-0.33

# 再make (千万不要 make install)

make

# 然后复制 nginx 文件覆盖之前安装包里的 nginx 文件,覆盖安装之前 ,先备份一个
nginx stop

cp /alidata/service/nginx/sbin/nginx  /alidata/service/nginx/sbin/nginx.back
cp -r objs/nginx /alidata/service/nginx/sbin/nginx

# 启动
/alidata/service/nginx/sbin/nginx

参考

https://segmentfault.com/a/1190000018418253?utm_source=coffeephp.com

4月 06

官网: https://redis.io/

可参考:
https://blog.vini123.com/107

###

wget http://download.redis.io/releases/redis-5.0.8.tar.gz

tar -xzvf  redis-5.0.8.tar.gz

cd redis-5.0.8

# 安装依赖
yum install tcl

# 继续

make

make test

# 没有问题就安装
make install PREFIX=/alidata/service/redis 

# 配置并启动redis
mkdir /alidata/service/redis/etc/

cp  /usr/local/src/redis/redis-5.0.8/redis.conf /alidata/service/redis/etc/

vim /alidata/service/redis/etc/redis.conf   #编辑redis.conf

daemonize yes   #将此行对应的no改成yes。

# 启动
/alidata/service/redis/bin/redis-server /alidata/service/redis/etc/redis.conf

# 连接 redis
/alidata/service/redis/bin/redis-cli

配置开机自启动

# 开机自启动

cp /usr/local/src/redis/redis-5.0.8/utils/redis_init_script /etc/init.d/redis

vim /etc/init.d/redis

# 然后修改EXEC、REDIS_CLI、CONF对应的值。分别对应服务端位置、客户端位置、配置文件位置。保存,退出。修改后的脚本如下;
# 修改

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

REDISPORT=6379
EXEC=/alidata/service/redis/bin/redis-server
CLIEXEC=/alidata/service/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF=/alidata/service/redis/etc/redis.conf

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

执行权限,并开启服务重启自启动

chmod +x /etc/init.d/redis   #执行权限
chkconfig redis on   #系统服务中启动redis服务
chkconfig --list   #系统服务启动列表
/etc/init.d/redis start   #启动redis

安装 php redis 扩展

cd /usr/local/src

mkdir php-redis

cd php-redis

wget http://pecl.php.net/get/redis-5.2.1.tgz

tar -xizvf redis-5.2.1.tgz

cd redis-5.2.1 

# 编译安装
phpize

./configure 

make && make install

# 配置
vim /alidata/service/php/etc/php.ini

在末尾加上 extension=redis.so 保存。

# 重启
/etc/init.d/php-fpm restart

# 查看
php -m | grep redis
4月 06

mysql8忘记密码有点不一样。其实很坑的,明明密码没错误,偏偏说错误。就算错误了,使用 skip-grant-tables 这玩意也进不去 mysql。那现在使用一个简单的方法来搞定这个问题。

这里使用 --init-file 方式重启 mysql 可以设置 root 用户的密码。亲测有效。

--init-file 干啥子的呢。就是 mysql 启动的时候,执行 --init-file对应的文件里的语句。

那么操作吧。

vim /usr/local/temp/resetPd.txt

# 加入下边命令,重新设置 root 密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '@¥#abcd1234';

:wq 保存

# 然后重启 mysql
service mysqld restart --init-file=/usr/local/temp/resetPd.txt --console 

# 再用新密码登录 mysql
mysql -u root -p 

# 发现果然好使,果然可以登录上去了