CentOS搭建开发环境

TMaize 于 2016-03-10 发布

Update: 2020/02/05

系统版本 CentOS 7

服务器配置

安装常用软件

yum update
yum groupinstall -y "Development Tools"
yum install cmake wget openssl openssl-devel yum-utils
yum install bash-completion lrzsz scl-utils screen net-tools telnet
yum install curl libcurl libcurl-devel bzip2 bzip2-deve libffi-devel
yum install freetype freetype-devel libjpeg libjpeg-devel
yum install libpng libpng-devel sqlite sqlite-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel

更新根证书

yum install ca-certificates

安装源

官方源会安装在/etc/yum.repos.d

# 一些官方yum比较低的软件可以使用这里的安装高级版本
# 使用scl命令共存多个版本
yum install centos-release-scl

yum 常用命令

yum list [all,installed,available,updates,extras]
yum install <packages>              # 安装指定的包
yum deplist <packages>              # 显示软件包的依赖信息
yum remove <packages>               # 卸载指定的软件包
yum info <packages>                 # 查看软的信息
yum search <keywords>               # 根据关键字查找,xx*以xx开头,想要支持正则可以使用yum list all | grep xxx
yum provides <keywords>             # 反查包含特定文件名的包
yum clean all                       # 清除yum缓存
yum makecache                       # 建立索引

关闭不用的服务

SSH 配置

不建议使用用户名+密码的方式登陆,容易被人扫描暴力破解

可以同时开启密码认证和公钥认证

# /etc/ssh/sshd_config
# Port 22  sshd服务端口,建议改掉
# PubkeyAuthentication yes 允许公钥登陆,公钥配置到AuthorizedKeysFile指定的文件
# PermitRootLogin yes 允许root登陆
# PasswordAuthentication yes 密码登陆
vi /etc/ssh/sshd_config
# 重启服务
service sshd restart

在服务器 authorized_keys 文件中新添加一行公钥,方便一点可以使用ssh-copy-id命令

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/keys/ -R

本地机器配置,C:\Users\xxx\.ssh\config 文件配置好后直接ssh aliyun即可登陆

Host aliyun
     HostName 106.xxx.xxx.xxx
     User root
     Port 22
     IdentityFile C:/Users/xxx/.ssh/id_rsa_nopwd
     PreferredAuthentications publickey

中文支持

# 查看系统拥有语言包,zh_CN.utf8是简体中文
locale -a
# 如果没有
yum install kde-l10n-Chinese
# 修改locale文件 LANG=zh_CN.utf8
# 重启生效
vi /etc/locale.conf

vim 配置 ~/.vimrc,文件的换行符记得设置为 unix 风格的,不然会报错

set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set encoding=utf-8
set termencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

Nginx

安装

configure 的过程如果有缺少依赖直接 yum 安装即可

wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2/
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make
make install

启动

# 启动
/usr/local/nginx/sbin/nginx
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 更新配置
/usr/local/nginx/sbin/nginx -s reload

配置

配置文件/usr/local/nginx/conf/nginx.conf

# 禁止IP或其他域名直接访问
server {
    listen       80 default;
    server_name  _;
    types {
        application/json *;
    }
    default_type application/json;
    return 404 '{"status":404,"msg":"这里没有部署项目-_-|||"}';
}
# 静态内容
server {
    listen       80;
    server_name  xxx.com;
    location / {
        root   /www/xxx.com;
        index  index.html;
    }
    error_page 404 403 500 502 503 504 /404.html;
}
# 反向代理Tomcat
server {
    listen       80;
    server_name  java.xxx.com;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080;
    }
}
# 反向代理Tomcat单个应用
server {
    listen       80;
    server_name  app1.xxx.com;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080/app1/;
    }
    location /app1 {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080;
    }
}
# 反向代理PHP
server {
    listen       80;
    server_name  php.xxx.com;
    root   /www/php.xxx.com/;
    index  index.html index.htm index.php;
    # rewrite
    location / {
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }
    # typecho 地址重写配置,显示不支持,强制开启就行了
    location /typecho {
        # 找不到时候重写成pathinfo
        if (!-e $request_filename) {
            rewrite  ^/(.*)$ /typecho/index.php/$1  last;
            break;
        }
    }
    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index  index.php;
        #设置PATH_INFO,注意fastcgi_split_path_info已经自动改写了fastcgi_script_name变量
        #后面不需要再改写SCRIPT_FILENAME,SCRIPT_NAME环境变量,所以必须在加载fastcgi.conf之前设置
        fastcgi_split_path_info  ^(.+\.php)(/.*)$;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
        #加载Nginx默认"服务器环境变量"配置
        include         fastcgi.conf;
    }
}

Mysql

从 centos7 开始已经不在支持 mysql,官方推荐安装 mariadb

自己可以通过添加官方镜像源安装, 或者 rpm-bundle 方式安装,或者源码编译安装(不推荐)

安装

先删除 mariadb 相关的包

yum remove mariadb mysql mysql-libs
rpm -qa | grep mysql

官方源安装(速度极慢)

wget https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
yum install mysql-community-server

bundle 方式安装(推荐)

wget https://mirrors.cloud.tencent.com/mysql/downloads/MySQL-5.7/mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar
# 解压出好多,只需要依次安装下面4个就够了,注意安装顺序
rpm -ivh mysql-community-common-5.7.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.30-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.30-1.el7.x86_64.rpm

启动

systemctl start mysqld   #启动 MySQL
systemctl stop mysqld    #关闭 MySQL
systemctl restart mysqld #重启 MySQL
systemctl status mysqld  #查看 MySQL 运行状态
systemctl enable mysqld  #设置开机启动
systemctl disable mysqld #关闭开机启动

更改密码

启动后需要以 root 用户登入进去,然后更改密码,不然没有操作权限

# 获取默认的随机密码
grep 'temporary password' /var/log/mysqld.log

# 登陆
mysql -u root -p

# 允许设置简单密码,重启后该配置失效
set global validate_password_policy=0;
set global validate_password_length=4;

# 设置密码,由于安全策略,不要设置过于简单的密码
set password = password('Xxxxxxx');

# 新建root用户,允许远程访问,授予所有权限,完事后在mysql.user表把  Grant_priv改成Y,然后重启
grant all privileges on *.* to 'root'@'%' identified by '设置新用户密码';
# grant all privileges on *.* to 'root'@'%' identified by '设置新用户密码' WITH GRANT OPTION;
flush privileges;

有时候防火墙,安全组都放开了,远程登录也允许了,远程仍然无法访问的话可以看下 mysql 监听的网卡,如果是 127.0.0.1 的话要改成 0.0.0.0

netstat -nltp

配置

配置编码为 utf8mb4,从而支持 emoji 表情

关闭密码强度校验插件

内存优化,由于内存较小,适当调整相关资源,关闭不需要的功能

配置文件位于/etc/my.cnf,追加如下内容

[client]
# 编码设置
default-character-set = utf8mb4

[mysql]
# 编码设置
default-character-set = utf8mb4

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address=0.0.0.0

# 编码设置
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

# 内存优化
performance_schema = OFF
performance_schema_max_table_instances = 600
table_definition_cache = 400
table_open_cache = 256

# 关闭密码校验插件
validate_password = OFF

配置信息查询

查看插件状态

show plugins;

查看启动后载入的配置信息

SHOW VARIABLES;
SHOW VARIABLES LIKE 'validate_password%';

JAVA

JDK 安装

先查询是否已经安装了 JDK 环境,如果需要安装其他版本的卸载即可

rpm -qa | grep jdk
rpm -qa | grep java
yum -y remove java*

推荐去华为镜像地址下载https://mirrors.huaweicloud.com/java/jdk/8u202-b08/

Oracle 官网不要去了,还要注册。另外 JDK8 之后,Oracle-JDK 就只支持商用了,但是 JDK 是开源的有其他的替代品,如 OpenJDK,Zulu,这里有个下载地址汇总的网站:https://www.injdk.cn/

可以使用 yum 直接安装 OpenJdk

yum list java* | grep 1.8.0
yum install java-1.8.0-openjdk-devel.x86_64
# 默认安装到
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64

安装完成后,还会在/usr/lib/jvm//etc/alternatives/创建多个链接

推荐直接绿色安装,然后配置下环境即可,好处是方便装多个版本进行切换,个人喜欢解压到/usr/local/java/

环境变量配置

修改/etc/profile文件,后面追加如下内容,修改完后source /etc/profile;echo $JAVA_HOME

export JAVA_HOME=/usr/local/java/jdk1.8.0_202
export JRE_HOME=/usr/local/java/jdk1.8.0_202/jre
export PATH=$PATH:$JAVA_HOME/bin

Tomcat 安装

直接去官方下载 zip 包,配置好 Java 环境后就能直接启动了

mkdir -p /usr/local/tomcat
cd /usr/local/tomcat
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.59/bin/apache-tomcat-8.5.59.tar.gz
tar -zxvf apache-tomcat-8.5.59.tar.gz

启动脚本: /usr/local/tomcat/apache-tomcat-8.5.59/bin/startup.sh

如果在你的机器上运行dd if=/dev/random of=random.dat count=40960非常慢的话,tomcat 启动超级超级慢。因为系统会收集运行状态如流量,CPU,键盘录入等信息,来产生的熵去生成真正的随机数。由于大部分的云主机熵值都不够,导致启动时卡在这里。可以用 urandom(伪随机) 来替代 random 来生成随机数即可

方法很简单,修改 Tomcat 的的启动参数,指定使用 urandom 或者修改 JDK 的配置指定使用 urandom

vim $JAVA_HOME/jre/lib/security/java.security
securerandom.source=file:/dev/random
# 改为
securerandom.source=file:/dev/urandom

启动 manager-gui,调整tomcat-users.xml添加访问用户,然后找到webapps/manager/META-INF/context.xml中注释掉仅允许内部 IP 访问的设置

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="user01" password="123456xxx" roles="admin-gui,manager-gui"/>

PHP

配置 PHP7 的源

yum install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安装

yum install php70w php70w-common php70w-fpm php70w-opcache php70w-gd php70w-mysqlnd php70w-mbstring php70w-devel

CentOS 自带了 PHP5,安装 PHP7 的时候会遇到一些冲突,提示什么冲突就就删除什么,直到上面的命令可以执行

yum remove php-common-5.4.16-46.el7.x86_64

安装完毕后

# 查看版本
php -v
# 查看安装的模块
php -m

配置文件位于/etc/php.ini/etc/php-fpm.d/www.conf,小内存建议调整下 php-fpm

pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 10
#启动,restart-重启,stop-停止
systemctl start php-fpm
#开机启动
systemctl enable php-fpm

下面是一些常用的拓展,以后缺少什么就安装什么

# 安装包 提供的拓展
php70w mod_php php70w-zts php70w-bcmath php70w-cli php-cgi php-pcntl, php-readline
php70w-common php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-exif, php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv, php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar, php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml , php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib
php70w-dba
php70w-devel
php70w-embedded php-embedded-devel
php70w-enchant
php70w-fpm
php70w-gd
php70w-imap
php70w-interbase php_database, php-firebird
php70w-intl
php70w-ldap
php70w-mbstring
php70w-mcrypt
php70w-mysql php-mysqli, php_database
php70w-mysqlnd php-mysqli, php_database
php70w-odbc php-pdo_odbc, php_database
php70w-opcache php70w-pecl-zendopcache
php70w-pdo php70w-pdo_sqlite, php70w-sqlite3
php70w-pdo_dblib php70w-mssql
php70w-pear
php70w-pecl-apcu
php70w-pecl-imagick
php70w-pecl-memcached
php70w-pecl-mongodb
php70w-pecl-redis
php70w-pecl-xdebug
php70w-pgsql php-pdo_pgsql, php_database
php70w-phpdbg
php70w-process php-posix, php-sysvmsg, php-sysvsem, php-sysvshm
php70w-pspell
php70w-recode
php70w-snmp
php70w-soap
php70w-tidy
php70w-xml php-dom, php-domxml, php-wddx, php-xsl
php70w-xmlrpc

Golang

mkdir -p /usr/local/go
mkdir -p /usr/local/go/gopath
cd /usr/local/go
wget https://studygolang.com/dl/golang/go1.18.2.linux-amd64.tar.gz
mkdir go1.18 && tar -zxf go1.18.2.linux-amd64.tar.gz -C go1.18 --strip-components 1
ln -s go1.18 go

配置环境变量/etc/profile后追加,然后source /etc/profile

export GOROOT=/usr/local/go/go
export GOPATH=/usr/local/go/gopath
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

NodeJS

mkdir -p /usr/local/nodejs
cd /usr/local/nodejs
wget https://nodejs.org/dist/v12.19.0/node-v12.19.0-linux-x64.tar.xz
xz -d node-v12.19.0-linux-x64.tar.xz
tar -xvf node-v12.19.0-linux-x64.tar

配置环境变量/etc/profile后追加,然后source /etc/profile

export NODE_HOME=/usr/local/nodejs/node-v12.19.0-linux-x64
export NPM_GLOBAL=/usr/local/nodejs/npm_global
export YARN_GLOBAL=/usr/local/nodejs/yarn_global
export PATH=$PATH:$NODE_HOME/bin:$NPM_GLOBAL/bin:$YARN_GLOBAL/bin

配置 ~/.npmrc~/.yarnrc

npm config set cache "/usr/local/nodejs/npm_cache"
npm config set prefix "/usr/local/nodejs/npm_global"
npm config set registry "http://mirrors.cloud.tencent.com/npm/"

npm install -g yarn
yarn config set cache-folder "/usr/local/nodejs/yarn_cache"
yarn config set global-folder "/usr/local/nodejs/yarn_global"
yarn config set prefix "/usr/local/nodejs/yarn_global"
yarn config set ignore-engines true

查看 yarn 配置生效

yarn global bin
yarn global dir
yarn cache dir

Python3

centos7 默认自带 python2.x,同时 yum 依赖 2.x 版本的。所以想要使用 python3 可以通过起个新名字来使用,比如 py3。或者把 python 的软链接替换掉,但是要修改/usr/bin/yum 脚本中声明的运行环境

注意在/usr/bin/目录下共有 6 个 python 相关命令

python    # python2.7 的软链接
python2   # python2.7 的软链接
python2.7 # 二进制文件

pip       # python脚本,指明使用python2
pip2      # python脚本,指明使用python2
pip2.7    # python脚本,指明使用python2

下面开始安装

wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz
tar -zxvf Python-3.7.7.tgz
cd Python-3.7.7
./configure --enable-optimizations
make altinstall # altinstall 不会只会向/usr/bin/写入python的符号链接
# 默认

安装后的一些目录

/usr/local/bin
/usr/local/lib/python3.7

为了系统不受影响,检查下 python 版本

python -V # Python 2.7.5
pip -V    # python 2.7

创建 python3 的符号链接

ln -s /usr/local/bin/python3.7 /usr/bin/python3
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
pip3 install pip -U
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

配置国内源,~/.pip/pip.conf文件不存在新建即可

[global]
index-url = http://mirrors.cloud.tencent.com/pypi/simple
trusted-host = mirrors.cloud.tencent.com

Shadowsocks

推荐安装 SSR,图省事可以使用一键安装脚本

yum -y install epel-release
yum -y install python-pip
pip install --upgrade pip
pip install shadowsocks

编写配置文件

{
  "server": "my_server_ip",
  "server_port": 8388,
  "local_address": "127.0.0.1",
  "local_port": 1080,
  "password": "mypassword",
  "timeout": 300,
  "method": "aes-256-cfb",
  "fast_open": false
}
# 前台运行
ssserver -c shadowsocks.json

# 后台运行
ssserver -c shadowsocks.json -d start
ssserver -c shadowsocks.json -d stop

zsh

yum install -y zsh
chsh -s /bin/zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

~/.zshrc中改下主题

ZSH_THEME="bureau"

升级 Git

CentOS 自带的 git 为 1.8.3.1,一些自动化工具需要 2.x 以上的版本,升级方法有二,重新编译安装或者添加其他源进行安装

yum remove git
yum install -y https://repo.ius.io/ius-release-el7.rpm
yum install -y git224
git --version

升级 Ruby

一般系统都自带 ruby,但是太古老了,由于安装 Jekyll 要求 ruby 的版本在 2.1 以上

yum remove ruby ruby-devel
# 官方源的ruby太古老了
yum install centos-release-scl-rh
yum update
yum list | grep rh-ruby
yum install rh-ruby27 rh-ruby27-ruby-devel
scl -l
scl enable rh-ruby27 bash # 关机/退出bash失效
ruby -v
gem -v

设置 gem

gem sources --remove https://rubygems.org/
gem sources -a https://mirrors.tuna.tsinghua.edu.cn/rubygems/
gem sources -l
gem sources --clear-all
gem sources --update

gem update
gem install bundler
bundle config mirror.https://rubygems.org https://mirrors.tuna.tsinghua.edu.cn/rubygems
bundle config list

设置开机自启动脚本

编写 unit 配置tomcat.service来做到开机自启,然后拷贝到/usr/lib/systemd/system/目录后即可。

通过 systemctl [status|start|stop|restart|enable|disable] tomcat.service 来控制启动,通过journalctl -f -u tomcat.service来查看日志

[Unit]
Description=Tomcat服务器
After=network-online.target mysqld.service
Wants=mysqld.service

[Service]
Type=forking
EnvironmentFile=/myapps/env # 读不到系统的环境变量需要写一个环境变量的配置文件指定 PATH JAVA_HOME JRE_HOME
ExecStart=/usr/local/tomcat/apache-tomcat-8.5.59/bin/catalina.sh start
ExecReload=/usr/local/tomcat/apache-tomcat-8.5.59/bin/catalina.sh restart
ExecStop=/usr/local/tomcat/apache-tomcat-8.5.59/bin/catalina.sh stop

[Install]
WantedBy=multi-user.target

另外图方便可以直接把开机启动后要执行的命令可以追加在rc.local后面,若启动的是脚本记得给执行权限

/usr/local/tomcat/apache-tomcat-8.5.59/bin/startup.sh
# 或者可以写个独立的脚本追加在后面执行,避免频繁修改系统配置
# /server-apps/auto-start.sh >/server-apps/auto-start.log 2>&1

以后在/server-apps/auto-start.sh中添加启动命令就成了。注意在 centos7 中,/etc/rc.d/rc.local的权限被降低了,所以需要chmod +x /etc/rc.d/rc.local