标签 Shell 下的文章

Update:

  • 2021-01-28: 换了联通宽带,不需要路由器拨号了,定时任务暂停了。

家里的路由器经常在一觉醒来的时候断网,随即小爱音响及其绑定的智能家具全都停止工作。每天早上八点的时候小爱同学会定时帮我加热热水器,而断网后只能去洗冷水。一次两次拔下路由器能解决,但最近越来越冷,洗冷水也觉得越发刺骨,我也实在没有动力从温暖的被窝里起来拔插路由器。

$ vim /etc/network-watch-dog
#!/bin/sh

# 锁文件位置
LOCK_FILE_PATH=/tmp/.network-watch-dog.lock
# 每次发包次数
PING_COUNT=3
# 离上次断网最大等待时间
MAX_WAITING_SECONDS=600

# 这里直接固定 ping ali dns
SUCCESS_COUNT=$(ping 223.5.5.5 -c ${PING_COUNT} 2>&1 | grep '64 bytes' | wc -l)

if [ ${SUCCESS_COUNT} == 0 ]; then
  TIMESTAMP=$(date +%s)

  if [ -f ${LOCK_FILE_PATH} ]; then
    LOCK_TIMESTAMP=$(cat ${LOCK_FILE_PATH})
    # 超过最大等待时间 删除锁文件重启
    if [ $(expr ${TIMESTAMP} - ${LOCK_TIMESTAMP}) -ge ${MAX_WAITING_SECONDS} ]; then
      rm -rf ${LOCK_FILE_PATH}
      reboot
    fi
  else
    # 写入断网时间到锁文件
    echo ${TIMESTAMP} > ${LOCK_FILE_PATH}
  fi
  /etc/init.d/network restart
else
  # 成功联网后判断上次断网遗留的锁文件
  if [ -f ${LOCK_FILE_PATH} ]; then
    rm -rf ${LOCK_FILE_PATH}
  fi
fi

最后给个执行权限,在定时任务中加入这条脚本,我这里每三分钟执行一次。

$ chmod a+x /etc/network-watch-dog
$ crontab -e
*/3 * * * * /etc/network-watch-dog > /dev/null 2>&1

等两天打算搞个断网消息通知。

Update:

  • 2021-01-25: 更新本地多网卡的情况

终端设置代理命令之前文章有写过的,趁今天重装了系统完善一下。

我的 Shell 使用 zsh,在 ~/.zshrc 下追加,如果使用 bash 需要修改 ~/.bashrc,可以使用 echo $SHELL 查看当前正在使用的 Shell。

命令用到了 jq 命令,需要先安装 brew install jq,其他平台替换为 yum 或者 apt-get

# 获取内网 IP
getlocalip() {
  local_ip=$(ifconfig | grep 'inet ' | grep -v 127.0.0.1 | awk '{printf("%s / %s; ", $2, $6)}')

  if [ ! "${local_ip}" ]; then
    echo "Your are offline."
  else
    echo "${local_ip}"
  fi
}

# 获取外网 IP
getpublicip() {
  response=$(curl 'https://api.ip.sb/geoip' -Lsk)
  if [ ! "${response}" ]; then
    echo "You are offline."
  else
    ip=$(echo $response | jq -r '.ip')
    country=$(echo $response | jq -r '.country')
    country_code=$(echo $response | jq -r '.country_code')
    city=$(echo $response | jq -r '.city')
    isp=$(echo $response | jq -r '.isp')
    echo "${ip} at ${city} in ${country}(${country_code}) / ${isp}"
  fi
}

# 获取 内外网 IP
getip() {
  echo "Local IP: $(getlocalip)"
  echo "Public IP: $(getpublicip)"
}

# 定义代理地址
export PROXY_URL=127.0.0.1:7890

# 开启代理
proxyon() {
  export https_proxy=http://${PROXY_URL};
  export http_proxy=http://${PROXY_URL};
  export all_proxy=socks5://${PROXY_URL};
  export no_proxy=localhost,127.0.0.1,*.local,*.vanke.com,*.vankeservice.com
  getip
}

# 关闭代理
proxyoff() {
  unset https_proxy http_proxy all_proxy no_proxy;
  getip
}

然后 source ~/.zshrc,就可以使用命令了。

$ getlocalip
10.39.32.* / 10.39.32.255; 10.39.229.* / 10.39.229.255;
$ getpublicip
120.237.94.* at Shenzhen in China(CN) / China Mobile Guangdong
$ getip
Local IP: 10.39.32.* / 10.39.32.255; 10.39.229.* / 10.39.229.255;
Public IP: 58.250.23.228 at Shenzhen in China(CN) / China Unicom Guangdong
$ proxyon
Local IP: 10.39.32.* / 10.39.32.255; 10.39.229.* / 10.39.229.255;
Public IP: 52.175.9.* at Central in Hong Kong(HK) / Microsoft Corporation
$ proxyoff
Local IP: 10.39.32.* / 10.39.32.255; 10.39.229.* / 10.39.229.255;
Public IP: 183.62.230.* at Guangzhou in China(CN) / China Telecom

前段时间,上了趟车在闲鱼 ¥90 收了一款 Newwifi3 路由器。到手后立马刷入了 OpenWRT 的衍生系统——PandoraBox,并配置了源以便于开启科学上网。[脸红]

Newwifi3

相比斐讯 K2P 配置相同,只是 5G 信号强度比较弱,不过我一个人住小单间,完全没问题。然而到了第一天晚上就发现一个问题:路由器的四侧有一条缝用于散热,但是我躺床上,那条缝就直接对着我,而缝里边有五颗 LED 灯。[尴尬]

侧边用于散热的缝

你想想,正困的时候,五条灯光直射你的眼睛,你还睡不睡。你说刺眼吧,又不能关,关了我这出租屋里 4G 信号贼差。气不气?[鼓掌]

闪瞎狗眼

无解,便开始寻找解决方案,能不能关掉着破灯:白天亮起,晚上熄灭。

找到了脚本,LED 由 /sys/class/leds 目录下的配置文件控制,写入不同的值来控制 LED 灯的点亮和熄灭,0 值为关闭,3 为开启,写入立即生效。

新建一个脚本用于控制 LED 熄灭,我将他存放在 /etc/off_leds.sh

$ vim /etc/off_leds.sh
#!/bin/bash
for i in `ls /sys/class/leds`
do
  cd /sys/class/leds
  cd $i
  echo 0 > brightness
done

给它个执行权限,然后执行:

$ chmod a+x /etc/off_leds.sh
$ /etc/off_leds.sh

再将它加入定时任务,LED 灯开启可以通过初始化 LED 的脚本实现:

$ crontab -e
# 关闭 LED 灯
0 22 * * * /etc/off_leds.sh
# 开启 LED 灯
0 7 * * * /etc/init.d/led start

到点熄灭了,完美。。。个屁,然而后半夜,它自己又亮了!!![内伤]

不知道为啥会自我唤醒 LED 灯,猜想是断网自动连接或者其他原因,但是我不管,我只想要睡觉![哭泣]

修改定时任务:

$ crontab -e
# 关闭 LED 灯
* 22-6 * * * /etc/off_leds.sh
# 开启 LED 灯
0 7 * * * /etc/init.d/led start

破灯,我还治不了你了。

另外,定时任务有时候写入后会不执行,猜想是 crontab 进程挂掉了,只需要重启下路由器或者直接粗暴的拔插电源就行。

我使用 cURL 代替 Postman 工具很长一段时间了,由于之前 Chrome 的更新,导致 Postman 无法正常工作,后来才知道需要再安装一个 Postman Interceptor 并启用才能正常使用,在联调接口的时候实在让人难堪。

Postman 能做的事儿 cURL 统统都能做,命令使参数更加直观,这里做一些笔记后续可查。

参数列表

这里的参数并不完整,后续随着 cURL 的更新参数会越来越丰富,我会尽量补充。

-a/--append    上传文件时,附加到目标文件
-A/--user-agent <string>    设置用户代理发送给服务器
-anyauth    可以使用“任何”身份验证方法
-b/--cookie <name=string/file>    cookie字符串或文件读取位置
    --basic    使用HTTP基本验证
-B/--use-ascii    使用ASCII /文本传输
-c/--cookie-jar <file>    操作结束后把cookie写入到这个文件中
-C/--continue-at <offset>    断点续转
-d/--data <data>    HTTP POST方式传送数据
    --data-ascii <data>    以ascii的方式post数据
    --data-binary <data>    以二进制的方式post数据
    --data-urlencode <name=data/[email protected]> HTTP POST 数据 url 编码
    --negotiate    使用HTTP身份验证
    --digest    使用数字身份验证
    --disable-eprt    禁止使用EPRT或LPRT
    --disable-epsv    禁止使用EPSV
-D/--dump-header <file>    把header信息写入到该文件中
    --egd-file <file>    为随机数据(SSL)设置EGD socket路径
    --tcp-nodelay    使用TCP_NODELAY选项
-e/--referer    来源网址
-E/--cert <cert[:passwd]>    客户端证书文件和密码 (SSL)
    --cert-type <type>    证书文件类型 (DER/PEM/ENG) (SSL)
    --key <key>    私钥文件名 (SSL)
    --key-type <type>    私钥文件类型 (DER/PEM/ENG) (SSL)
    --pass <pass>    私钥密码 (SSL)
    --engine <eng>    加密引擎使用 (SSL). "--engine list" for list
    --cacert <file>    CA证书 (SSL)
    --capath <directory>    CA目录 (made using c_rehash) to verify peer against (SSL)
    --ciphers <list>    SSL密码
    --compressed    要求返回是压缩的形势 (using deflate or gzip)
    --connect-timeout <seconds>    设置最大请求时间
    --create-dirs    建立本地目录的目录层次结构
    --crlf    上传是把LF转变成CRLF
-f/--fail    连接失败时不显示http错误
    --ftp-create-dirs    如果远程目录不存在,创建远程目录
    --ftp-method [multicwd/nocwd/singlecwd]    控制CWD的使用
    --ftp-pasv    使用 PASV/EPSV 代替端口
    --ftp-skip-pasv-ip    使用PASV的时候,忽略该IP地址
    --ftp-ssl    尝试用 SSL/TLS 来进行ftp数据传输
    --ftp-ssl-reqd    要求用 SSL/TLS 来进行ftp数据传输
-F/--form <name=content>    模拟http表单提交数据
    --form-string <name=string>    模拟http表单提交数据
-g/--globoff    禁用网址序列和范围使用{}和[]
-G/--get    以get的方式来发送数据
-H/--header <line>    自定义头信息传递给服务器
    --ignore-content-length    忽略的HTTP头信息的长度
-i/--include    输出时包括protocol头信息
-I/--head    只显示请求头信息
-j/--junk-session-cookies    读取文件进忽略session cookie
    --interface <interface>    使用指定网络接口/地址
    --krb4 <level>    使用指定安全级别的krb4
-k/--insecure    允许不使用证书到SSL站点
-K/--config    指定的配置文件读取
-l/--list-only    列出ftp目录下的文件名称
    --limit-rate <rate>    设置传输速度
    --local-port<NUM>    强制使用本地端口号
-L/--location    跟随重定向
    --location-trusted  Like '--location', and send auth to other hosts (H)
    --login-options OPTIONS  Server login options (IMAP, POP3, SMTP)
-m/--max-time <seconds>    设置最大传输时间
    --max-redirs <num>    设置最大读取的目录数
    --max-filesize <bytes>    设置最大下载的文件总量
-M/--manual    显示全手动
-n/--netrc    从netrc文件中读取用户名和密码
    --netrc-optional    使用 .netrc 或者 URL来覆盖-n
    --ntlm    使用 HTTP NTLM 身份验证
-N/--no-buffer    禁用缓冲输出
-o/--output    把输出写到该文件中
-O/--remote-name    把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel    使用HTTP代理
    --proxy-anyauth    选择任一代理身份验证方法
    --proxy-basic    在代理上使用基本身份验证
    --proxy-digest    在代理上使用数字身份验证
    --proxy-ntlm    在代理上使用ntlm身份验证
-P/--ftp-port <address>    使用端口地址,而不是使用PASV
-q    作为第一个参数,关闭 .curlrc
-Q/--quote <cmd>    文件传输前,发送命令到服务器
-r/--range <range>    检索来自HTTP/1.1或FTP服务器字节范围
--range-file    读取(SSL)的随机文件
-R/--remote-time    在本地生成文件时,保留远程文件时间
    --retry <num>    传输出现问题时,重试的次数
    --retry-delay <seconds>    传输出现问题时,设置重试间隔时间
    --retry-max-time <seconds>    传输出现问题时,设置最大重试时间
-s/--silent    静默模式。不输出任何东西
-S/--show-error    显示错误
    --socks4 <host[:port]>    用socks4代理给定主机和端口
    --socks5 <host[:port]>    用socks5代理给定主机和端口
    --stderr <file>    
-t/--telnet-option <OPT=val>    Telnet选项设置
    --trace <file>    对指定文件进行debug
    --trace-ascii <file>    Like --跟踪但没有hex输出
    --trace-time    跟踪/详细输出时,添加时间戳
-T/--upload-file <file>    上传文件
    --url <URL>    Spet URL to work with
-u/--user <user[:password]>    设置服务器的用户和密码
-U/--proxy-user <user[:password]>    设置代理用户名和密码
-w/--write-out [format]    什么输出完成后
-x/--proxy <host[:port]>    在给定的端口上使用HTTP代理
-X/--request <command>    指定什么命令
-y/--speed-time    放弃限速所要的时间,默认为30
-Y/--speed-limit    停止传输速度的限制,速度时间

示例

# 模拟 POST FORM 提交
$ curl http://localhost -d "a=1&b=2&c=3" 
# 携带 cookie 请求
$ curl http://localhost -b "cookie_field=value"
# 模拟 POST 上传文件
$ curl http://localhost -F "a=1" -F "[email protected]/path/to/file"
# 模拟 POST JSON 提交 需要设置 header 头
$ curl http://localhost -H "Content-Type:application/json" -d '{"a":1,"b":"secret"}'
# 申明请求 method
$ curl http://localhost -X GET/POST/PUT/DELETE/...
# 跟随重定向
$ curl http://localhost -L
# 显示 response header
$ curl http://localhost -i
# 显示调试信息
$ curl http://localhost -v
# GET 请求 url 编码参数
$ curl http://localhost -G --data-urlencode "port=4546" --data-urlencode "back_url=https://localhost/callback"

另外我终端中安装了 JSON 解析工具,可以通过管道符解析 JSON,macOS 通过 brew 安装:brew install jq。用法:curl http://localhost | jq,前提是响应的数据是一个正确的 JSON 格式,否则会报 parse error 的错误。

能用命令解决的绝不用 GUI,这是一种偏执,也是一种信仰。

在使用 LNMP 一类的集成环境之后,对单独编译安装从来是对着文档装。尽管在 Mac 下装过无数次,也踩过无数坑,但总是记不住一些细节步骤。将本次安装过程全程记录下来,在将来也可以作个参考。

安装环境

  • 服务器:CentOS 6.8 64 mini
  • 终端:iTerm2
注:为了环境足够干净,本次安装过程为全新安装,如果之前环境安装过集成环境请重装。

安装约定

  • 文章中命令使用到的 $ 均代表 root 用户身份,执行命令时请忽略 $ 符号
  • 为了保证正常安装,我发现许多同学喜欢跳着看,除开 Apache 和 Nginx 部分,其他强烈不建议你跳着看,除非你能解决类似 Command not found 的错误
  • Apache 和 Nginx 建议二选一,本文为测试环境,会同时安装
  • 软件包下载地址:/lnmp/,若不存在请手动执行 mkdir /lnmp 创建
  • 源码包编译安装位置:/usr/local/softwareName
  • 数据库存储文件路径:/data/mysql
  • Nginx 站点目录:/www/

Linux

CentOS 也是安装中的一部分,也记录下安装的过程。以下只截图的重点部分,其他直接默认即可。

安装

虚拟机挂载镜像后,开机,选择 Install system with basic video driver,回车。这个是基础安装,没有界面的。

选择安装模式

然后刷屏模式。。

然后检查介质,直接 Tab 键选择 Skip 跳过检查,如果手残选择了 OK 那么恭喜你,慢慢等吧,没半个小时好不了。

检查安装介质

欢迎页面,直接回车。

选择语言,默认,继续回车。

接下来是抹掉磁盘的警告,直接按 Tab 键选择 Re-initialize all 然后回车。

安装

然后输入你的管理员密码,若是弱口令会提示密码不安全,你可以修改密码或者选择 Use Anyway 来忽略警告,当然我强烈不建议你使用弱口令。

选择安装磁盘,直接默认,然后按 Tab 键切换到 OK,然后回车。

选择磁盘

然后是确认写入的警告,按 Tab 键选择 Write changes to disk

确认安装

然后是漫长的安装过程,这个过程受机器配置的影响安装时间也不确定,慢慢等。

安装中

安装完成,回车重启。

重启服务器

重启完成后直接输入用户名(root),密码登录系统。

配置网络

由于我是虚拟机安装,刚安装完成还没有网络,所以得先修改下网卡配置。

$ vi /etc/sysconfig/network-scripts/ifcfg-eth0 #修改网卡配置

ONBOOT 改为 yes,然后执行命令让网卡配置重载。

$ service network restart #重启网络服务

修改完网卡,尝试使用 ping 命令测试网络是否通畅。

更换 yum 源

总所周知的原因,国内的 yum 下载速度不用多说。先安装需要用到的工具。

$ yum install -y wget curl vim #安装需要的工具

安装完工具,然后先备份下 yum 源

$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

然后将阿里云的 yum 源下载到本地的 etc/yum.repos.d/,当然你也可以选择其他的源镜像,比如:163 或者 中科大 的镜像源。这里我直接以阿里云的为例。

你可以使用 wget 进行下载:

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

或者使用 curl 进行下载(二选一):

$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

然后清空缓存。

$ yum clean all
$ yum makecache

然后执行升级命令:

$ yum update

安装更新,键入 y 回车继续。这个过程的等待时间由你的服务器配置和带宽决定。

安装前的配置

防火墙配置

防火墙用于管理入栈和出栈流量,所以先配置放行端口,HTTP 协议端口:80、MySQL 数据库端口:3306、HTTPS 协议端口:443。当然,你也可以直接将防火墙关掉,但是强烈不建议这么做。

$ vim /etc/sysconfig/iptables #编辑防火墙规则

COMMIT 之前按下 i 键插入规则。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

按下 Esc 键,键入 :wq 保存,然后重启防火墙。

$ service iptables restart

然后查看防火墙规则,是否有刚添加的规则。

$ iptables -L

如果有 http 或者 80 端口开放则配置完成。

关闭 SELinux

SELinux 是红帽(Red Hat)系列系统中的一个强制访问控制系统,你可以理解为 360 安全卫士,是必须关的一个东西。(除了百度,最讨厌的就是 360 了,当然还有金山。)

首先编辑 SELinux 的配置文件:

$ vim /etc/selinux/config #配置 SELinux

按下 i 插入,将 SELINUX=enforcing 前边加一个 # 注释掉,SELINUXTYPE=targeted 同样在前面加 # 注释掉,在尾部插入 SELINUX=disabled,然后按下 Esc 键入 :wq 保存。

然后执行命令使配置生效。

$ setenforce 0
注:这里有一个坑,执行命令后,配置可能还是未生效。最好的解决方案是:重启服务器。

安装编译工具和库文件

软件的安装编译需要用到的工具,直接复制安装,这个过程比较漫长。

$ yum install -y make apr* autoconf automake curl curl-devel gcc gcc-c++  cmake  gtk+-devel zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch perl kernel-headers compat* cpp glibc libgomp libstdc++-devel keyutils-libs-devel  libarchive   libsepol-devel libselinux-devel krb5-devel libXpm* freetype freetype-devel freetype* fontconfig fontconfig-devel libjpeg* libpng* php-common php-gd gettext gettext-devel ncurses* libtool* libxml2 libxml2-devel patch policycoreutils bison

安装 libmcrypt

libmcrypt 是 PHP 的加密拓展库。这里我准备了一个下载地址:libmcrypt-2.5.8.tar.gz

你可以使用 wget 命令进行下载。 若不存在 /lnmp/ 目录请先使用 mkdir /lnmp 创建目录。

$ cd /lnmp/ # 切换到 /lnmp 目录,不存在则先 mkdir /lnmp 再执行
$ wget https://static.openapi.link/libmcrypt-2.5.8.tar.gz  # 下载 libmcrypt 包
$ tar zxvf libmcrypt-2.5.8.tar.gz  # 解压 libmcrypt 包
$ cd libmcrypt-2.5.8  # 进入 libmcrypt 解压的目录
$ ./configure  # 配置
$ make && make install  # 编译安装

这个过程大约在 10s-20s内完成,接下来开始安装 Nginx。

Nginx

创建 Nginx 用户组

首先,下载 Nginx,下载地址:Nginx-1.13.2.tar.gz,下载到 /lnmp/

$ cd /lnmp/
$ wget http://nginx.org/download/nginx-1.13.2.tar.gz
$ tar zxvf nginx-1.13.2.tar.gz
$ cd nginx-1.13.2

到这里,建议为 Nginx 创建一个运行的账户 www,且该账户不允许登录系统。

$ useradd www -s /sbin/nologin  # 创建一个运行账户

安装 Nginx

开始编译 Nginx 并安装。

$ ./configure --prefix=/usr/local/nginx --user=www --group=www --without-http_memcached_module --with-http_stub_status_module --with-http_ssl_module  # 配置
$ make && make install  # 编译并安装

配置

要将 Nginx 加入开机启动项,需要先下载一个管理脚本,下载地址:nginx,同样下载到 /lnmp/ 中。

$ cd /lnmp/
$ wget https://static.openapi.link/nginx  # 下载脚本

或者编写一个名为 nginx 脚本。

$ cd /lnmp/
$ vim nginx

将以下代码复制粘贴进该脚本中。

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid
}
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL

然后按下 Esc 键,键入 :wq 保存并退出。

设置将 Nginx 加入开机启动项,并赋予执行权限。

$ cp /lnmp/nginx /etc/init.d/  # 将脚本拷贝至服务项
$ chmod 755 /etc/init.d/nginx  # 赋予脚本执行权限
$ chkconfig nginx start  # 设置开机启动项
$ service nginx start  # 启动 Nginx
nginx already running....

此刻,通过本地浏览器访问该服务器 IP 地址,能看到 Welcome to nginx 说明安装成功。

Welcome to nginx

若访问失败,请检查 #防火墙配置 或检查是否有开启 Shadowsocks 类似的翻墙程序。

MySQL

创建 MySQL 用户组

MySQL 的安装同样需要新建一个 mysql 的用户(组),且不允许登录。

$ useradd mysql -s /sbin/nologin

创建 MySQL 数据库文件存放目录,并修改所属用户为 mysql

$ mkdir -p /var/mysql/data  # 创建数据库文件存放目录
$ chown -R mysql:mysql /var/mysql/data  # 设置该目录用户为 mysql

安装 MySQL

开始安装 MySQL,同样需先下载 MySQL,下载地址:mysql-5.5.28.tar.gz,下载到 /lnmp/ 目录下。

$ cd /lnmp/
$ wget https://static.openapi.link/mysql-5.5.28.tar.gz  # 下载 MySQL
$ tar zxvf mysql-5.5.28.tar.gz  # 解压
$ cd mysql-5.5.28  # 进入解压目录
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/var/mysql/data \
-DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306
$ make && make install  # 编译安装

这个等待过程视机器性能而定,完成后配置 MySQL 的配置文件。

$ cd /usr/local/mysql
$ cp ./support-files/my-huge.cnf /etc/my.cnf  #拷贝配置文件
#键入 y 覆盖
$ vim /etc/my.cnf  #编辑配置文件,在 [mysqld] 部分增加

[mysql] 中添加数据库文件的保存路径。

datadir = /var/mysql/data

按下 Esc 键,键入 :wq 保存并退出,接着生成数据库文件,并将 MySQL 添加至服务项。

$ ./scripts/mysql_install_db --user=mysql  #生成mysql系统数据库
$ cp ./support-files/mysql.server /etc/init.d/mysql  #把 Mysql 加入系统启动

配置

$ vim /etc/init.d/mysql

找到 basedirdatadir,默认情况下,他们应该没有值,将配置修改。

basedir=/usr/local/mysql
datadir=/var/mysql/data

按下 Esc 键,键入 :wq 保存并退出,接着赋予脚本执行权限并加入开机启动项。

$ chmod 755 /etc/init.d/mysql  # 赋予执行权限
$ chkconfig mysql on  # 添加开机启动项
$ chown -R mysql /usr/local/mysql  # 将 /usr/local/mysql 所属用户修改为 mysql
$ service mysql start  # 启动 MySQL
Starting MySQL.. SUCCESS!

最后,将 MySQL 加入系统环境变量中,即可使用 mysql 命令。

$ vim /etc/profile

在文件末尾追加。

export PATH=$PATH:/usr/local/mysql/bin

按下 Esc 键,键入 :wq 保存并退出,然后将配置生效。

$ source /etc/profile

配置 MySQL 管理员密码。

$ mysql_secure_installation
...
Enter current password for root (enter for none):  # 输入 root 密码,没有,直接回车
...
Set root password? [Y/n]  # 输入 y 回车
...
New password:  # 设置密码
Re-enter new password:  # 确认密码
...
Remove anonymous users? [Y/n]  # 移除匿名用户,输入 y 回车
...
Disallow root login remotely? [Y/n]  # 不允许 root 用户远程登录,允许,输入 n 回车
...
Remove test database and access to it? [Y/n]  # 移除 test 数据库,这个随便
...
Reload privilege tables now?  # 重载,是,输入 y 回车
...
Thanks for using MySQL!

现在,在终端中输入 mysql 命令是否正常。

$ mysql -uroot -p
Enter password:
mysql>

按下 Ctrl + C 退出 MySQL,至此,MySQL 安装完成。

PHP7

首先下载 PHP7 的包,下载地址:php-7.1.11.tar.gz,下载到 /lnmp/ 目录下。

$ cd /lnmp/
$ wget -O php-7.1.11.tar.gz http://cn2.php.net/get/php-7.1.11.tar.gz/from/this/mirror  # 下载
$ tar zxvf php-7.1.11.tar.gz  # 解压
$ cd php-7.1.11
$ ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc  --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mysqlnd --with-mysql-sock=/usr/local/mysql/mysql.sock --with-gd --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --with-jpeg-dir --with-freetype-dir   --with-pdo-mysql=/usr/local/mysql/
$ make && make install  # 编译并安装

这个过程就有点长了,可以喝杯茶 ????,放松放松眼睛 ,或者给我留个言吧 _(:зゝ∠)__。

配置

一杯茶之后,继续。

$ cp php.ini-production /usr/local/php7/etc/php.ini  # 复制 php 配置文件到安装目录
$ rm -f /etc/php.ini  # 删除系统自带配置文件
$ ln -s /usr/local/php7/etc/php.ini /etc/php.ini  # 添加软链接
$ cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf  # 拷贝模板配置文件为php-fpm配置文件
$ vim /usr/local/php7/etc/php-fpm.conf

找到 ;pid = run/php-fpm.pid 将前面的 ; 去掉。

$ cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf  # 复制配置文件
$ vim /usr/local/php7/etc/php-fpm.d/www.conf  # 编辑配置文件

找到 user = nobodygroup = nobodynobody 均改为 www 用户(组)。

开机启动

$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  #拷贝php-fpm到启动目录
$ chmod 0755 /etc/init.d/php-fpm  #修改权限
$ chkconfig php-fpm on  #设置开机启动
$ service php-fpm start  #启动php-fpm
Starting php-fpm  done

配置 Nginx 支持 PHP

$ vim /usr/local/nginx/conf/nginx.conf  # 编辑 nginx 配置文件

找到一下代码去掉前面的注释符号 #

location ~ .php$ {
    ...
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # 注释掉以上条代码添加下面代码
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

至此,PHP 与 Nginx 关联配置完成,你可以在 /usr/local/nginx/html/ 新建 index.php 中写入 PHP 代码测试。

配置主机

Nginx 默认的路径:/usr/local/nginx/html/ 这样的目录太深了不利于操作,我把他放到根目录以便查找。

$ ln -s /usr/local/nginx/html/ /www  # 设置软连接

然后配置虚拟主机。

$ vim /usr/local/nginx/conf/nginx.conf  # 编辑 Nginx 配置文件

最末尾的 } 之前一行 插入 include "vhost/*.conf";,并创建虚拟主机配置目录。

$ cd /usr/local/nginx/conf
$ mkdir vhost

若需要新增一个虚拟站点,则直接在 /usr/local/nginx/conf/vhost 目录下新建一个站点配置文件,并在 /www/ 下创建一个同名的目录即可。

格式如下:

server {
        listen       80;  # 监听端口
        server_name  www.example.com;  # 域名
        root         /www/www.example.com;  # 站点根目录
        index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

Apache *

注:强烈不建议同时安装 Apache 和 Nginx。

首先你到官网下载 Apache,这里我安装的是 2.2.34 比较稳定的版本,我准备了一个地址:httpd-2.2.34.tar.gz

你可以使用 wget 命令进行下载。 若不存在 /lnmp/ 目录请先使用 mkdir /lnmp 创建目录。

$ cd /lnmp  # 切换到 /lnmp 目录,不存在则先 mkdir /lnmp 再执行
$ wget http://mirrors.shuosc.org/apache//httpd/httpd-2.2.34.tar.gz  #下载 httpd 包

然后解压并进入解压后的目录。

$ tar zxvf httpd-2.2.34.tar.gz  #解压 httpd 包
$ cd httpd-2.2.34  #进入 httpd 解压后的目录

配置安装位置并开始安装。

$ ./configure --prefix=/user/local/apache2  #配置安装目录
$ make && make install  #编译并安装

启动 Apache 服务器。

$ /usr/local/apache2/bin/apachectl start

关于 Apache 只简单介绍到这里,关于开机启动项、系统服务、虚拟主机(virtual host)等配置先立个 flag,有时间再更新。