/ linux

CentOS

CentOS 7

参考文章:

常用系统脚本

firewall 防火墙问题

CentOS 与 Ubuntu 最大的区别在于默认启用防火墙。尤其在阿里云上开放 Redis 等服务的端口时要格外注意,建议参考 centos的防火墙firewall操作手册 来操作。

系统调整

如果使用的是阿里云:阿里云系统初始化

设置软件源

更换源镜像

cd /etc/yum.repos.d/
sudo mv CentOS-Base.repo CentOS-Base.repo.bak
sudo curl -o CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo

设置 EPEL 源

CentOS 用户可以直接通过 yum install epel-release 安装

sudo yum install epel-release -y

默认安装的 epel 源为国外服务器,这里需要我们手动更换到 EPEL阿里源

生成缓存:

yum clean all
yum makecache

更新系统软件:

sudo yum update

相关文档:

检查下源列表:

yum  repolist

实际使用时,会自动使用最快的源:

➜  ~ sudo yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: mirrors.aliyun.com
 * webtatic: us-east.repo.webtatic.com
Resolving Dependencies
Upgrade  1 Package

Total download size: 14 k

安装常用工具命令

sudo yum install -y zip unzip bind-utils wget curl git
  1. zip unzip 用于解压缩,composer 会依赖。
  2. bind-utils 包含命令:dig nslookup 等。

例如,查询 dns 使用:

nslookup baidu.com

可以用 dig 命令来自我检测下DNS解析是否配置成功,七牛云配置免费ssl证书,需要配置和验证对应域名的 TEXT 对应的解析值:

dig cdn.haobing.wang text
dig cdn.haobing.wang cname

zsh 和 oh-my-zshell

zsh

查看系统当前的shell

echo $SHELL

/bin/bash

查看 bin 下是否有 zsh 包

cat /etc/shells

如果没有则安装:

sudo yum install zsh -y

切换 shell 至 zsh,根据提示输入当前用户的密码:

chsh -s /bin/zsh  # 注意,此处不需要root权限,不需要在前面加sudo

按提示所述,shell已经更改为zsh了,现在查看一下系统当前使用的shell:

echo $SHELL

/bin/bash

可以看到现在还没切换过来,需要重启一下服务器后再登录。

sudo reboot

重新登录后,zsh 会有个提示你需要创建 ~/.zshrc 的提示。可以让 zsh 自动创建。

现在看下

echo $SHELL

/bin/zsh

至此,zsh 就安装完毕。下面安装 oh-my-zsh。

oh-my-zsh

oh-my-zsh 源码是放在github上的,所以先要安装git

oh-my-zsh文档

oh-my-zsh 安装完成后,我们安装下 autojump 插件

sudo yum install autojump autojump-zsh -y

如果提示没有包,则需要 Set up EPEL on CentOS 7:

sudo yum install epel-release

查看下当前仓库列表:

sudo yum repolist

插件

oh my zsh 项目提供了完善的插件体系,相关的文件在~/.oh-my-zsh/plugins目录下,默认提供了100多种,大家可以根据自己的实际学习和工作环境采用,想了解每个插件的功能,只要打开相关目录下的 zsh 文件看一下就知道了。插件也是在 ~/.zshrc 里配置,找到plugins关键字,你就可以加载自己的插件了,系统默认加载 git ,你可以在后面追加内容。

~/.zshrc

接下来修改 ~/.zshrc 让插件生效。如果没有,则手动创建 touch ~/.zshrc:

vi ~/.zshrc
  • 开启常用插件:plugins=(git) => plugins=(git autojump)
  • 设置编码格式:# export LANG=en_US.UTF-8 => export LANG=en_US.UTF-8

引用更改并立刻生效:

source ~/.zshrc

相关文档:

nginx

确保 eple-release 已安装,否则 nginx 的版本在 1.10 左右。

确认 nginx 是否正常工作:

curl 127.0.0.1

常用命令:

sudo systemctl start nginx
systemctl status nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

配置防火墙:

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

sudo systemctl start firewalld
systemctl status firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld.service

PS:阿里云 ECS 还需要但在设置策略组开启 80 和 443 端口后,外网才能访问。

参考 Debian 下的 Nginx 配置目录,来对当前配置进行改造:

sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

Note: This directory layout was introduced by Debian contributors, but we are including it here for added flexibility with managing our server blocks (as it's easier to temporarily enable and disable server blocks this way).


sudo nano /etc/nginx/nginx.conf

Add these lines to the end of the http {} block:

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

这里需要调整 SELinux, 否则 默认目录 /usr/share/nginx/html 下的文件可以正常访问,但是 /var/www/project 内的文件永远都只会得到 403。

开发环境的 CentOS 可以临时关闭:

# 临时关闭
sudo setenforce Permissive
# 检查权限
namei -om /path/to/check

# To check if SELinux is running
getenforce

# 查看 selinux type 是否为 httpd_sys_content_t
ls -Z /path/to/check

# 将 selinux type 设置为 httpd_sys_content_t
sudo chcon -Rt httpd_sys_content_t /path/to/check

永久关闭需要编辑文件 /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled

注意,生产环境不要关闭!

安装 epel-release,如果之前没有安装过

sudo yum install epel-release -y
sudo yum update
sudo yum install nginx -y

nginx 简单改造出 site-enable,参见 nginx

参考资料:

php7

安装 epel-release,如果之前没有安装过

Precompiled PHP 7.x binaries are available for CentOS 7 from the Remi's RPM repositories.

先安装 7.1 作为默认版本(很重要,必须要先有个默认版本的 php,否则 composer 会有问题)。
再安装 5.6 或 7.2 作为备选版本。参考:How to Run Multiple Websites with Different PHP Versions in Nginx

安装 PHP7 扩展

常用扩展:

  • fpm
  • opcache
  • mbstring
  • mcrypt
  • xml
  • intl
  • gd
  • imagick
  • bcmath
  • memcached
  • redis
  • mysql
  • pgsql
  • mongodb
  • pdo

default version 安装扩展:

yum install -y php-fpm 
yum install -y php-opcache php-mbstring php-mcrypt php-xml
yum install -y php-intl php-gd php-imagick php-bcmath
yum install -y php-redis php-mysql php-pdo

multiple versions,备选版本安装:

yum install -y php72 php72-php-fpm 
yum install -y php72-php-opcache php72-php-mbstring php72-php-mcrypt  php72-php-xml
yum install -y php72-php-intl php72-php-gd php72-php-imagick php72-php-bcmath
yum install -y php72-php-redis php72-php-mysql phh72-php-pdo

查找其他扩展:

yum search php-
yum search php72-

关于 PHP 的启动、停止、重启:

sudo systemctl start php-fpm.service
systemctl status php-fpm.service
sudo systemctl enable php-fpm.service

备选版本的 php 配置文件在 /etc/opt/remi/php72 下。

告诉PHP只接受服务器上实际存在的文件的URI。这可以缓解安全漏洞,如果请求的.php文件不存在于文件系统中,PHP解释器可能会被欺骗,从而允许任意代码执行。

sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php.ini

安装完成后,重启 fpm

sudo systemctl restart php-fpm.service

修改配置文件 /etc/php.ini

sudo vi /etc/php.ini
  • ;cgi.fix_pathinfo=1 改为 cgi.fix_pathinfo=0
  • ;expose_php = On 改为 expose_php = Off

配置 PHP-FPM

sudo vi /etc/php-fpm.d/www.conf

PHP is set to run under the apache user by default, but this user needs to match the user and group used by NGINX. If you installed NGINX as described above, NGINX will use the nginx user and group. Change the user and group variables in www.conf to match.

将 PHP-FPM 默认的 user 和 group 替换成 Nginx 的运行用户 nginx

sudo sed -i 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sudo sed -i 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf

配置 Vagrant 的配置:config.vm.synced_folder "../Sites", "/var/www", owner: 'nginx', group: 'nginx'

网站上面有些目录或文件需要有写入权限,这样你得为这些目录和文件分配合适的权限,一般可以把它们的拥有者设置成 php-fpm 使用的用户,查看一下谁在运行 php-fpm 这个服务:

sudo ps aux|grep php

PHP-FPM 运行的 user 要和代码的 owner 一致(保证程序可以创建目录、文件)。

开发环境

Vagrant 中建议统一为 vagrant

user = vagrant
gHroup = nginx

对应的 Vagrantfile 中:

config.vm.synced_folder "../Sites", "/var/www", owner: "vagrant", group: "nginx"

生产环境

生产环境中建议统一为 deploy

user = deploy
group = deploy

修改完成后重启 php-fpm:

sudo systemctl restart php-fpm

访问 info.php 验证

connect() to unix:/var/run/php-fpm/php-fpm.sock failed (13: Permission denied)

ls -ahl /var/run/php-fpm/php-fpm.sock

Set an NGINX Site Configuration File

  1. Create a root directory for your site. Replace example.com with your site’s domain:
sudo mkdir -p /var/www/example.com/
  1. Disable the default site configuration provided with the package as an example:
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled
  1. Website configuration files should be kept in /etc/nginx/conf.d/. Create a configuration file for your site. Again replace example.com with your site’s domain.
server {
    listen         80 default_server;
    listen         [::]:80 default_server;
    server_name    example.com www.example.com;
    root           /var/www/example.com;
    index          index.html;

    location / {
      try_files $uri $uri/ =404;
    }

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

安装 mariaDB

查看当前系统是否安装了数据库

mysql -V

如果你之前安装了 5.5 的版本,需要先卸载:

mysqldump -u root -ppassword --all-databases > /tmp/all-database.sql
systemctl stop mysql
yum remove mariadb-server mariadb mariadb-libs

How to Upgrade MariaDB 5.5 to MariaDB 10.1 on CentOS/RHEL 7 and Debian Systems

如果没有,则安装最新版 mariaDB,但是官方源下载太慢,我们可以使用MariaDB 镜像源,执行以下命令替换源地址:

sudo sed -i 's#yum.mariadb.org#mirrors.ustc.edu.cn/mariadb/yum#' /etc/yum.repos.d/mariadb
# 建议使用 HTTPS
sudo sed -i 's#http://mirrors.ustc.edu.cn#https://mirrors.ustc.edu.cn#g' /etc/yum.repos.d/mariadb

常用命令:

sudo systemctl start mariadb
sudo systemctl enable mariadb
systemctl status mariadb
sudo systemctl stop mariadb
sudo systemctl restart mariadb

Securing the MariaDB Server

MariaDB includes a security script to change some of the less secure default options for things like remote root logins and sample users. Use this command to run the security script:

sudo mysql_secure_installation

The script provides a detailed explanation for every step. The first prompts asks for the root password, which hasn't been set so we'll press ENTER as it recommends. Next, we'll be prompted to set that root password, which we'll do.

SELinux

获取当前 SELinux 运行状态

getenforce

可能返回结果有三种:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。

目前常见发行版中,RHEL 和 Fedora 默认设置为 Enforcing,其余的如 openSUSE 等为 Permissive。

改变 SELinux 运行状态

setenforce [ Enforcing | Permissive | 1 | 0 ]

该命令可以立刻改变 SELinux 运行状态,在 EnforcingPermissive 之间切换,结果保持至关机。一个典型的用途是看看到底是不是 SELinux 导致某个服务或者程序无法运行。若是在 setenforce 0 之后服务或者程序依然无法运行,那么就可以肯定不是 SELinux 导致的。

若是想要永久变更系统 SELinux 运行环境,可以通过更改配置文件 /etc/sysconfig/selinux 实现。注意当从 Disabled 切换到 Permissive 或者 Enforcing 模式后需要重启计算机并为整个文件系统重新创建安全标签(touch /.autorelabel && reboot)。

备注

file_get_contents(): SSL operation failed with code 1. And more

sudo vim /etc/php.ini

openssl.cafile=/path/to/cert.pem

sudo systemctl restart php-fpm

error

报错提示

/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.21.1) or chardet (2.2.1) doesn't match a supported version!

原因:python库中 urllib3 (1.21.1) or chardet (2.2.1) 的版本不兼容

解决方法:

sudo pip uninstall urllib3
sudo pip uninstall  chardet
sudo pip install requests