centos7安装网站环境问题

最近在centos7上安装了nginx+php+mysql的环境,由于抛弃了一键脚本,自己踩了一些坑,特此记录一下。

说明:这些问题很多都是在启用selinux下才会出现的,如果直接关闭selinux,这些问题就都不是问题了,但是为了安全,还是不建议关闭selinux。

1、安装

nginx和mysql都可以直接使用yum安装,php需要添加自定义的源才行,推荐使用remi源,但是remi源默认安装的是最新版本,如果需要安装历史版本就需要使用其他方法


sudo yum install epel-release //安装 EPEL 软件包
sudo yum install yum-utils //安装 yum 扩展包

sudo yum install nginx //安装nginx

sudo yum install mariadb-client mariadb-server //安装mariadb

sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm //安装 remi 源
sudo yum-config-manager --enable remi-php72 //启用 remi 仓库
sudo yum update //启用 remi 仓库
sudo yum install php72 //安装 PHP7.2
sudo yum install php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache //安装 php-fpm 和一些其他模块

PostgreSQL安装
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm //安装源
sudo yum install -y postgresql12 postgresql12-server //安装,这个是12,可以安装其他版本,查看可用的话,可以使用yum list|grep postgresql
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb //初始化数据库
sudo systemctl start postgresql-12  //启动PostgreSQL服务
修改postgres账号密码
su postgres //切换linux用户为postgres
psql //启动SQL Shell
ALTER USER postgres WITH PASSWORD 'NewPassword'; //修改密码
vi /var/lib/pgsql/12/data/postgresql.conf //修改IP绑定
listen_addresses='*'
vi /var/lib/pgsql/12/data/pg_hba.conf //允许所有IP访问
host  all  all 0.0.0.0/0 md5

IUS源
yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

IUS 安装完毕,可以使用php72 -v查看安装结果

设置php-fpm服务

sudo systemctl enable/start/stop/status php-fpm

安装php低版本: 升级yum源

CentOS 6.x

rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm

CentOS 7.x

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

CentOS 8.x

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

如果想删除上面安装的包,重新安装

rpm -qa | grep webstatic
rpm -e  上面搜索到的包即可

运行 yum install 安装PHP:

PHP5.5

yum install php55w.x86_64 php55w-cli.x86_64 php55w-common.x86_64 php55w-gd.x86_64 php55w-ldap.x86_64 php55w-mbstring.x86_64 php55w-mcrypt.x86_64 php55w-mysql.x86_64 php55w-pdo.x86_64

PHP5.6

yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64

PHP7.0

yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64

安装PHP FPM,分别对应为PHP5.5、PHP5.6、PHP7.0

yum install php55w-fpm
yum install php56w-fpm
yum install php70w-fpm
#CentOS 8
dnf module install php:remi-7.x

启动 php-fpm

php-fpm

重启 php-fpm

kill -INT `cat /var/run/php-fpm/php-fpm.pid`

2、nginx自定义根目录后403

开启selinux后,nginx如果自定义了目录,那么不管怎么设置权限访问都是403,需要在自定义的根目录执行一下命令

chcon -R system_u:object_r:httpd_sys_content_t:s0 /xxx
这个是临时修改,可以使用semanage修改
semanage fcontext -a -t httpd_sys_content_t "/xxx(/.*)?"
restorecon -Rv /xxx
在华为欧拉(EulerOS)服务器中,使用yum安装的php,无法启动,需要设置selinux:
setsebool -P httpd_execmem 1

3、php无法访问

php安装完成后无法访问,需要修改nginx默认配置文件nginx.conf里面的内容,

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
修改为
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

4、php无法写文件

同上一条,自定义目录之后可以访问了,但是php写文件失败,需要执行以下命令

chcon -R -t httpd_sys_rw_content_t  /xxx
或者
semanage fcontext -a -t httpd_sys_rw_content_t "/xxx/html(/.*)?"
restorecon -Rv /xxx/html/

setsebool -P allow_httpd_anon_write 1
补:2020-04-22
如果php无法使用curl请求外部地址,设置:
setsebool -P httpd_can_network_connect 1
补:2020-04-28
如果挂载了nfs卷,需要设置:
setsebool -P httpd_use_nfs 1
允许访问远程mysql
setsebool -P httpd_can_network_connect_db 1

5、修改运行用户

修改nginx运行用户

vi nginx.conf

user www-data;
修改为
user xxx;

systemctl restart nginx

修改php运行用户

vi /et/opt/remi/php74/php-fpm.d/www.conf

user = www-data
group = www-data
修改为
user = xxx
group = xxx

cd /var/opt/remi/php74/run/php-fpm
chown xxx:xxx php-fpm.pid

service php74-php-fpm restart

修改nginx缓存文件目录权限

cd /var/lib
chown xxx:root nginx
cd nginx
chown xxx:root tmp

6、mysql允许外部访问

进入mysql后执行以下命令

grant all privileges on *.* to root@'%' identified by "password";
flush privileges;

命令行修改mysql用户密码

update user set password=password(‘111111’) where user=’root';
flush privileges;

7、mariadb编码问题

yum安装mariadb后默认编码不是utf8,需要修改 首先查看目前的字符集

show variables like "%character%"

修改server编码

vi /etc/my.cnf.d/server.cnf
在server.cnf中[mysqld]添加如下代码

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

修改client编码

vi /etc/my.cnf.d/mysql-clients.cnf

mysql-clients.cnf中[mysql]中添加如下代码

[mysql]
default-character-set=utf8mb4

8、修改ssh默认端口

以前的直接修改sshd_config文件里面端口的方法已经不行了,需要打开selinux端口

首先安装semanage工具,一般默认已经安装

yum provides semanage
yum -y install policycoreutils-python

添加新端口

semanage port -a -t ssh_port_t -p tcp 2048

查看是否添加成功

semanage port -l | grep ssh

在防火墙上允许新添加的端口

firewall-cmd --permanent --zone=public --add-port=2048/tcp
firewall-cmd --reload

修改ssh的config,设置为新的端口

注释掉默认的22端口,改为新端口
vi /etc/ssh/sshd_config
#Port 22
Port 2048
PermitRootLogin no //禁止root登陆
重启ssh服务
systemctl restart sshd

普通用户加入sudo组

vi /etc/sudoers
youuser ALL=(ALL) ALL
%youuser ALL=(ALL) ALL
youuser ALL=(ALL) NOPASSWD: ALL
%youuser ALL=(ALL) NOPASSWD: ALL

第一行:允许用户youuser执行sudo命令(需要输入密码)
第二行:允许用户组youuser里面的用户执行sudo命令(需要输入密码)
第三行:允许用户youuser执行sudo命令,并且在执行的时候不输入密码
第四行:允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码

9、mysql其他问题

创建用户,授权

> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost';
> FLUSH PRIVILEGES;
> quit

删除用户

> DROP USER dbadmin@localhost;

查看授权

> SHOW GRANTS FOR rfc@localhost;

删除授权

> REVOKE INSERT, UPDATE ON classicmodels.* FROM rfc@localhost;

更改密码

> ALTER USER 'user-name'@'localhost' IDENTIFIED BY 'NEW_USER_PASSWORD';
> FLUSH PRIVILEGES;

设置root密码

> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

php监听从端口改为sock

修改www.conf,将

listen = 127.0.0.1:9000
修改为:
listen = /var/run/php-fpm/php-fpm.sock

将listen.owner和listen.group修改为nginx用户(删除注释即可)
删除listen.mode的注释

修改nginx配置文件,添加

upstream php-fpm{
  server unix:/var/run/php-fpm/php-fpm.sock;
}
修改fastcgi_pass

fastcgi_pass 127.0.0.1:9000;
修改为
fastcgi_pass php-fpm;

PostgreSQL数据库相关语法


#创建数据库
CREATE DATABASE mydb;

#查看所有数据库
\l

#切换当前数据库
\c mydb

#创建表
CREATE TABLE test(id int,body varchar(100));

#查看当前数据库下所有表
\d

#新建用户
CREATE USER test WITH PASSWORD 'test';

#赋予指定账户指定数据库所有权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO test;

#移除指定账户指定数据库所有权限
REVOKE ALL PRIVILEGES ON DATABASE mydb TO test